home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / util / misc / ReportPlus.lha / reportplus / source / rp.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-06-28  |  105.8 KB  |  2,856 lines

  1. /* $Filename:    ReportPlus/Source/rp.c
  2.  * $VER:         Report+ 4.7
  3.  * $Description: Multipurpose utility
  4.  *
  5.  * © Copyright 2001 James R. Jacobs. Freely distributable.
  6.  *        _
  7.  *       //      -=AMIGA=-
  8.  *      //
  9.  * _   //
  10.  * \\ //
  11.  *  \X/
  12.  
  13. #INCLUDES -------------------------------------------------------------- */
  14.  
  15. /* #include <assert.h> */
  16.  
  17. #include <exec/types.h>
  18. #include <exec/alerts.h>
  19. #include <exec/nodes.h>
  20. #include <exec/memory.h>
  21. #include <exec/execbase.h>
  22. #include <proto/exec.h>
  23. #include <intuition/intuition.h>
  24. #include <clib/intuition_protos.h>
  25. #include <intuition/gadgetclass.h>
  26. #include <libraries/gadtools.h>
  27. #include <clib/gadtools_protos.h>
  28. #include <workbench/workbench.h> /* struct DiskObject */
  29. #include <libraries/asl.h>
  30. #include <proto/asl.h>
  31. #include <dos/dos.h>
  32. #include <dos/dostags.h>
  33. #include <dos/dosextens.h>
  34. #include <proto/dos.h>
  35. #include <diskfont/diskfont.h>
  36. #include <proto/diskfont.h>
  37. #include <graphics/gfx.h>
  38. #include <graphics/displayinfo.h>
  39. #include <graphics/gels.h>
  40. #include <clib/graphics_protos.h>
  41. #include <utility/tagitem.h>
  42. #include <proto/utility.h>
  43. #include <workbench/icon.h>
  44. #include <clib/icon_protos.h>
  45. #include <clib/alib_protos.h>
  46. #include <resources/battmem.h>
  47. #include <resources/battmembitsamiga.h>
  48. #include <resources/battmembitsshared.h>
  49.  
  50. #define ALL_REACTION_CLASSES
  51. #define ALL_REACTION_MACROS
  52. #include <reaction/reaction.h>
  53.  
  54. #include <classes/window.h>
  55. #include <clib/window_protos.h>
  56. #include <gadgets/listbrowser.h>
  57. #include <clib/listbrowser_protos.h>
  58.  
  59. /* boing ball */
  60. #define ID_BORDER 0
  61. #define ID_BNG    3
  62. #define RBMDEPTH  4
  63.  
  64. #include <ctype.h>
  65. #include <stdio.h>          /* FILE, printf() */
  66. #include <stdlib.h>         /* EXIT_SUCCESS, EXIT_FAILURE */
  67. #include <string.h>
  68. #include "rp.h"
  69. #include "animtools.h"
  70. #include "anim_images.h"
  71. #include "boards.h"
  72.  
  73. #define FUNCTIONS 12
  74.  
  75. #define PALMENUHEIGHT (126 + (FUNCTIONS * 8)) /* page 0 */
  76. #define PUBMENUHEIGHT (PALMENUHEIGHT + 28)
  77.  
  78. /*--------------------------------------------------------------*/
  79. /* Structures for the boing ball and satellites.                */
  80. /*--------------------------------------------------------------*/
  81.  
  82. NEWBOB newBoingBob =
  83. {   NULL,               /* initial image */
  84.     BNG3WWIDTH,         /* WORD width */
  85.     BNG3HEIGHT,         /* line height */
  86.     BNG3DEPTH,          /* image depth */
  87.     0x3,                /* plane pick */
  88.     0x0,                /* plane on/off */
  89.     SAVEBACK | OVERLAY, /* VSprite flags */
  90.     0,                  /* dbuf (0=false) */
  91.     RBMDEPTH,           /* raster depth */
  92.     32, 100,            /* x, y position */
  93.     (1L<<ID_BORDER),    /* hit mask */
  94.     (1L<<ID_BNG)        /* me mask */
  95. };
  96. NEWANIMSEQ newBoingSeq =
  97. {   NULL, (WORD *)boing3Image, boing3XTranses, boing3YTranses,
  98.     boing3Times, (WORD (**) ()) boing3CRoutines, 0, BNG3COUNT, 0,
  99. };
  100.  
  101. NEWBOB newSatABob =
  102.     {
  103.     NULL, SATWWIDTH, SATHEIGHT, SATDEPTH,
  104.         1,
  105.         11,
  106.     SAVEBACK | OVERLAY, 0, RBMDEPTH, 0,0, (1L<<ID_BORDER), (1L<<ID_BNG),
  107.     };
  108. NEWANIMSEQ newSatASeq =
  109.     {
  110.     NULL, (WORD *)satImage, satAXTranses, satAYTranses,
  111.     satTimes, (WORD (**) ()) satACRoutines, 0, SATCOUNT, 1,
  112.     };
  113.  
  114. NEWBOB newSatBBob =
  115.     {
  116.     NULL, SATWWIDTH, SATHEIGHT, SATDEPTH,
  117.         12,
  118.         0,
  119.     SAVEBACK | OVERLAY, 0, RBMDEPTH, 0,0, (1L<<ID_BORDER), (1L<<ID_BNG),
  120.     };
  121. NEWANIMSEQ newSatBSeq =
  122.     {
  123.     NULL, (WORD *)satImage, satBXTranses, satBYTranses,
  124.     satTimes, (WORD (**) ()) satBCRoutines, 0, SATCOUNT, 1,
  125.     };
  126. NEWBOB newSatCBob =
  127.     {
  128.     NULL, SATWWIDTH, SATHEIGHT, SATDEPTH,
  129.         1,
  130.         9,
  131.     SAVEBACK | OVERLAY, 0, RBMDEPTH, 0,0, (1L<<ID_BORDER), (1L<<ID_BNG),
  132.     };
  133. NEWANIMSEQ newSatCSeq =
  134.     {
  135.     NULL, (WORD *)satImage, satCXTranses, satCYTranses,
  136.     satTimes, (WORD (**) ()) satCCRoutines, 0, SATCOUNT, 1,
  137.     };
  138.  
  139. /* help|about... */
  140. MODULE struct AnimOb*   setupBoing(void);
  141. MODULE struct GelsInfo* setupDisplay(void);
  142.        WORD             bounceORoutine(struct AnimOb *anOb);
  143.                         /* this is an oroutine so parameters are fixed */
  144. MODULE WORD             goInFrontOfHead(struct AnimComp *aComp);
  145. MODULE WORD             goBehindHead(struct AnimComp *aComp);
  146.  
  147. MODULE struct Window*   AboutWindowPtr = NULL;
  148. MODULE struct GelsInfo  *gInfo;
  149. MODULE struct AnimOb    *boingOb;
  150. MODULE struct AnimOb    *animKey;
  151.  
  152. #ifdef __STORM__
  153.    #pragma chip
  154. #endif
  155. MODULE UWORD chip PalLogoData[754] =
  156. {   /* Plane 0 */
  157.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x000F,
  158.     0x1FFF,0xFC00,0x1FFF,0xFFFF,0xFFF0,0x0000,0x7FF0,0x007F,0xFFC0,0x007F,0xFFFF,0x8000,0x000F,
  159.     0x1FFF,0xFFE0,0x1FFF,0xFFFF,0xFFFF,0xE007,0xFFFF,0xC07F,0xFFFF,0x807F,0xFFFF,0x8001,0xF00F,
  160.     0x1FFF,0xFFF8,0x1FFF,0xFFDF,0xFFFF,0xF81F,0xFFFF,0xE07F,0xFFFF,0xE07F,0xFFFF,0x800F,0xF00F,
  161.     0x1FE0,0x0FFC,0x1F80,0x001F,0xE07F,0xFC3F,0xC00F,0xF07F,0x81FF,0xF000,0x7FC0,0x000F,0xF00F,
  162.     0x1FE0,0x03FC,0x1F80,0x001F,0xE003,0xFC7F,0x8007,0xF87F,0x800F,0xF000,0x7FC0,0x000F,0xF0FF,
  163.     0x1FE0,0x03FC,0x1F00,0x401F,0xE003,0xFC7F,0x8007,0xF87F,0x800F,0xF000,0x7FC0,0x000F,0xE7FF,
  164.     0x1FE0,0x07F8,0x1FFF,0x801F,0xE00F,0xF87F,0x8007,0xF87F,0x803F,0xE000,0x7FC0,0x000F,0xFFFF,
  165.     0x1FE0,0x1FE0,0x1FFE,0x001F,0xE07F,0xE07F,0x8007,0xF87F,0x81FF,0x8000,0x7FC0,0x01FF,0xFF0F,
  166.     0x1FFF,0xFF80,0x1FF8,0x001F,0xFFFF,0x807F,0x8007,0xF87F,0xFFFE,0x0000,0x7FC0,0x0FFF,0xF80F,
  167.     0x1FFF,0xFE00,0x1F80,0x001F,0xFFFE,0x007F,0x8007,0xF07F,0xFFF8,0x0000,0x7FC0,0x0FEF,0xF00F,
  168.     0x1FFF,0xFE00,0x1F80,0x001F,0xFFE0,0x003F,0xC00F,0xF07F,0xFFF8,0x0000,0x7FC0,0x1E0F,0xF00F,
  169.     0x1FE0,0xFF00,0x1F80,0x001F,0xE000,0x001F,0xF03F,0xE07F,0x83FC,0x0000,0x7FC0,0x000F,0xF00F,
  170.     0x1FE0,0x7F80,0x1FFF,0xFE1F,0xE000,0x0007,0xFFFF,0x807F,0x81FE,0x0000,0x7F80,0x000F,0xF00F,
  171.     0x1FE0,0x3FC0,0x1FFF,0xF81F,0xE000,0x0007,0xFFFE,0x007F,0x80FF,0x0000,0x7E00,0x000F,0x000F,
  172.     0x1FE0,0x1FE0,0x1FFF,0xE01F,0xE000,0x0000,0x7FE0,0x007F,0x807F,0x8000,0x7800,0x0000,0x000F,
  173.     0x1FE0,0x0FF0,0x0000,0x001F,0xE000,0x0000,0x0000,0x007F,0x803F,0xC000,0x6000,0x0000,0x000F,
  174.     0x1FE0,0x07F8,0x0000,0x001F,0xE000,0x0000,0x0000,0x007F,0x801F,0xE000,0x0000,0x0000,0x000F,
  175.     0x7FE0,0x03FC,0x0000,0x007F,0xE000,0x0000,0x0000,0x01FF,0x800F,0xF000,0x0000,0x0000,0x000F,
  176.     0x7FE0,0x01FE,0x0000,0x00FF,0xE000,0x0000,0x0000,0x01FF,0x8007,0xF800,0x0000,0x0000,0x000F,
  177.     0x0000,0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0xFC00,0x0000,0x0000,0x000F,
  178.     0x0000,0x007F,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0xFE00,0x0000,0x0000,0x000F,
  179.     0x0000,0x003F,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF00,0x0000,0x0000,0x000F,
  180.     0x0000,0x001F,0xE000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7F80,0x0000,0x0000,0x000F,
  181.     0x0000,0x000F,0xF0F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FC3,0xC000,0x0000,0x000F,
  182.     0x0000,0x0007,0xFFF0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1FFF,0xC000,0x0000,0x000F,
  183.     0x0000,0x0003,0xFFE0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0FFF,0x8000,0x0000,0x000F,
  184.     0x0000,0x0000,0xFF80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03FE,0x0000,0x0000,0x000F,
  185.     0x0000,0x0000,0xFF00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03FC,0x0000,0x0000,0x000F,
  186.     /* Plane 1 */
  187.     0x3FFF,0xFC00,0x3FFF,0xFFFF,0xFFF0,0x0000,0x7FF0,0x00FF,0xFFC0,0x00FF,0xFFFF,0x0000,0x0000,
  188.     0x3FFF,0xFF80,0x3FFF,0xFFFF,0xFFFE,0x0007,0xFFFF,0x00FF,0xFFFE,0x00FF,0xFFFF,0x0001,0xF000,
  189.     0x3FFF,0xFFC0,0x3FFF,0xFFFF,0xFFFF,0xC01F,0xFFFF,0x00FF,0xFFFE,0x00FF,0xFFFF,0x001F,0xE000,
  190.     0x3FC0,0x0FF0,0x3F00,0x003F,0xC07F,0xE03F,0xE07F,0xC0FF,0x01FF,0x8080,0x7F80,0x001F,0xE000,
  191.     0x3FC0,0x07F8,0x3F00,0x003F,0xC007,0xF87F,0x801F,0xE0FF,0x001F,0xE000,0xFF80,0x001F,0xE0F0,
  192.     0x3FC0,0x07F8,0x3F00,0x003F,0xC007,0xF8FF,0x000F,0xF0FF,0x001F,0xE000,0xFF80,0x001F,0xE7E0,
  193.     0x3FC0,0x07F8,0x3FFF,0x803F,0xC00F,0xF8FF,0x000F,0xF0FF,0x001F,0xE000,0xFF80,0x001F,0xFFE0,
  194.     0x3FC0,0x1FE0,0x3FFE,0x003F,0xC07F,0xE0FF,0x000F,0xF0FF,0x007F,0x8000,0xFF80,0x03FF,0xFF00,
  195.     0x3FDF,0xFF80,0x3FF8,0x003F,0xDFFF,0x80FF,0x000F,0xF0FF,0x7FFE,0x0000,0xFF80,0x1FFF,0xF800,
  196.     0x3FFF,0xFE00,0x3F00,0x003F,0xFFFE,0x00FF,0x000F,0xF0FF,0xFFF0,0x0000,0xFF80,0x1FFF,0xE000,
  197.     0x3FFF,0xFC00,0x3F00,0x003F,0xFFE0,0x00FF,0x000F,0xE0FF,0xFFF0,0x0000,0xFF80,0x1E1F,0xE000,
  198.     0x3FC1,0xFC00,0x3F00,0x003F,0xC000,0x007F,0x801F,0xE0FF,0x07F0,0x0000,0xFF80,0x001F,0xE000,
  199.     0x3FC1,0xFE00,0x3F7F,0xFF3F,0xC000,0x003F,0xFFFF,0x80FF,0x07F8,0x0000,0xFF80,0x001F,0xE000,
  200.     0x3FC0,0xFF00,0x3FFF,0xFC3F,0xC000,0x001F,0xFFFE,0x00FF,0x03FC,0x0000,0xFE00,0x001F,0x0000,
  201.     0x3FC0,0x7F80,0x3FFF,0xF03F,0xC000,0x0000,0x7FE0,0x00FF,0x01FE,0x0000,0xF800,0x0010,0x0000,
  202.     0x3FC0,0x3FC0,0x2000,0x003F,0xC000,0x0000,0x0000,0x00FF,0x00FF,0x0000,0xE000,0x0000,0x0000,
  203.     0x3FC0,0x1FE0,0x0000,0x003F,0xC000,0x0000,0x0000,0x00FF,0x007F,0x8000,0x8000,0x0000,0x0000,
  204.     0xFFC0,0x0FF0,0x0000,0x00FF,0xC000,0x0000,0x0000,0x03FF,0x003F,0xC000,0x0000,0x0000,0x0000,
  205.     0xFFC0,0x07F8,0x0000,0x00FF,0xC000,0x0000,0x0000,0x03FF,0x001F,0xE000,0x0000,0x0000,0x0000,
  206.     0x8000,0x03FC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x000F,0xF000,0x0000,0x0000,0x0000,
  207.     0x0000,0x01FE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0007,0xF800,0x0000,0x0000,0x0000,
  208.     0x0000,0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0xFC00,0x0000,0x0000,0x0000,
  209.     0x0000,0x007F,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0xFE00,0x0000,0x0000,0x0000,
  210.     0x0000,0x003F,0xC1F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF03,0xC000,0x0000,0x0000,
  211.     0x0000,0x001F,0xE1E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7F8F,0x8000,0x0000,0x0000,
  212.     0x0000,0x000F,0xF9E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FEF,0x8000,0x0000,0x0000,
  213.     0x0000,0x0007,0xFFC0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1FFF,0x0000,0x0000,0x0000,
  214.     0x0000,0x0001,0xFF00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FC,0x0000,0x0000,0x0000,
  215.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  216. };
  217. MODULE UWORD chip PubLogoData[1482] =
  218. {   /* Plane 0 */
  219.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8000,0x0000,
  220.     0x1FFF,0xF000,0x0000,0x0000,0x0000,0x0000,0x7FF0,0x007F,0xFFC0,0x007F,0xFFFF,0x8000,0x0000,
  221.     0x1FFF,0xFE00,0x1FFF,0xFFFF,0xFFF0,0x0003,0xFFFE,0x007F,0xFFF8,0x007F,0xFFFF,0x8000,0x0000,
  222.     0x1FFF,0xFFC0,0x1FFF,0xFFFF,0xFFFE,0x0007,0xFFFF,0x807F,0xFFFF,0x007F,0xFFFF,0x8000,0x1000,
  223.     0x1FFF,0xFFE0,0x1FFF,0xFFFF,0xFFFF,0xE00F,0xFFFF,0xC07F,0xFFFF,0x807F,0xFFFF,0x8001,0xF000,
  224.     0x1FFF,0xFFF0,0x1FFF,0xFFFF,0xFFFF,0xF01F,0xFFFF,0xE07F,0xFFFF,0xC07F,0xFFFF,0x800F,0xF000,
  225.     0x1FFF,0xFFF8,0x1FFF,0xFFDF,0xFFFF,0xF81F,0xFFFF,0xE07F,0xFFFF,0xE07F,0xFFFF,0x800F,0xF000,
  226.     0x1FE0,0x7FF8,0x1F80,0x001F,0xE07F,0xF83F,0xE01F,0xF07F,0x81FF,0xE000,0x7FC0,0x000F,0xF000,
  227.     0x1FE0,0x0FFC,0x1F80,0x001F,0xE00F,0xFC3F,0xC00F,0xF07F,0x803F,0xF000,0x7FC0,0x000F,0xF000,
  228.     0x1FE0,0x0FFC,0x1F80,0x001F,0xE00F,0xFC3F,0x800F,0xF07F,0x803F,0xF000,0x7FC0,0x000F,0xF000,
  229.     0x1FE0,0x03FC,0x1F80,0x001F,0xE003,0xFC7F,0x8007,0xF87F,0x800F,0xF000,0x7FC0,0x000F,0xF010,
  230.     0x1FE0,0x03FC,0x1F80,0x001F,0xE003,0xFC7F,0x8007,0xF87F,0x800F,0xF000,0x7FC0,0x000F,0xF0F0,
  231.     0x1FE0,0x03FC,0x1FFF,0xE01F,0xE003,0xFC7F,0x8007,0xF87F,0x800F,0xF000,0x7FC0,0x000F,0xE7F0,
  232.     0x1FE0,0x07F8,0x1FFF,0xC01F,0xE007,0xF87F,0x8007,0xF87F,0x801F,0xE000,0x7FC0,0x000F,0xFFF0,
  233.     0x1FE0,0x0FF8,0x1FFF,0x801F,0xE00F,0xF87F,0x8007,0xF87F,0x803F,0xE000,0x7FC0,0x000F,0xFFF0,
  234.     0x1FE0,0x1FF0,0x1FFF,0x001F,0xE01F,0xF07F,0x8007,0xF87F,0x807F,0xC000,0x7FC0,0x007F,0xFFC0,
  235.     0x1FE0,0x7FE0,0x1FFE,0x001F,0xE07F,0xE07F,0x8007,0xF87F,0x81FF,0x8000,0x7FC0,0x03FF,0xFF00,
  236.     0x1FFF,0xFFC0,0x1FFC,0x001F,0xFFFF,0xC07F,0x8007,0xF87F,0xFFFF,0x0000,0x7FC0,0x0FFF,0xF800,
  237.     0x1FFF,0xFF80,0x1FF8,0x001F,0xFFFF,0x807F,0x8007,0xF87F,0xFFFE,0x0000,0x7FC0,0x0FFF,0xF000,
  238.     0x1FFF,0xFF00,0x1F80,0x001F,0xFFFF,0x007F,0x8007,0xF87F,0xFFFC,0x0000,0x7FC0,0x0FFF,0xF000,
  239.     0x1FFF,0xFE00,0x1F80,0x001F,0xFFFE,0x007F,0x8007,0xF07F,0xFFF8,0x0000,0x7FC0,0x0F8F,0xF000,
  240.     0x1FFF,0xFE00,0x1F80,0x001F,0xFFFC,0x003F,0xC007,0xF07F,0xFFF8,0x0000,0x7FC0,0x0C0F,0xF000,
  241.     0x1FFF,0xFE00,0x1F80,0x001F,0xFFE0,0x003F,0xC00F,0xF07F,0xFFF8,0x0000,0x7FC0,0x000F,0xF000,
  242.     0x1FE1,0xFF00,0x1F80,0x001F,0xE000,0x003F,0xC01F,0xE07F,0x87FC,0x0000,0x7FC0,0x000F,0xF000,
  243.     0x1FE0,0xFF00,0x1F80,0x001F,0xE000,0x001F,0xF03F,0xE07F,0x83FC,0x0000,0x7FC0,0x000F,0xF000,
  244.     0x1FE0,0xFF80,0x1FFF,0xFF1F,0xE000,0x001F,0xFFFF,0xC07F,0x83FE,0x0000,0x7FC0,0x000F,0xF000,
  245.     0x1FE0,0x7F80,0x1FFF,0xFE1F,0xE000,0x000F,0xFFFF,0x807F,0x81FE,0x0000,0x7F80,0x000F,0xF000,
  246.     0x1FE0,0x7FC0,0x1FFF,0xFC1F,0xE000,0x000F,0xFFFF,0x007F,0x81FF,0x0000,0x7F00,0x000F,0xC000,
  247.     0x1FE0,0x3FC0,0x1FFF,0xF81F,0xE000,0x0007,0xFFFE,0x007F,0x80FF,0x0000,0x7E00,0x000E,0x0000,
  248.     0x1FE0,0x3FE0,0x1FFF,0xF01F,0xE000,0x0003,0xFFFC,0x007F,0x80FF,0x8000,0x7C00,0x0000,0x0000,
  249.     0x1FE0,0x1FE0,0x1FFF,0xE01F,0xE000,0x0000,0x7FE0,0x007F,0x807F,0x8000,0x7800,0x0000,0x0000,
  250.     0x1FE0,0x1FF0,0x0000,0x001F,0xE000,0x0000,0x0000,0x007F,0x807F,0xC000,0x7000,0x0000,0x0000,
  251.     0x1FE0,0x0FF0,0x0000,0x001F,0xE000,0x0000,0x0000,0x007F,0x803F,0xC000,0x6000,0x0000,0x0000,
  252.     0x1FE0,0x0FF8,0x0000,0x001F,0xE000,0x0000,0x0000,0x007F,0x803F,0xE000,0x4000,0x0000,0x0000,
  253.     0x1FE0,0x07F8,0x0000,0x001F,0xE000,0x0000,0x0000,0x007F,0x801F,0xE000,0x0000,0x0000,0x0000,
  254.     0x7FE0,0x07FC,0x0000,0x007F,0xE000,0x0000,0x0000,0x01FF,0x801F,0xF000,0x0000,0x0000,0x0000,
  255.     0x7FE0,0x03FC,0x0000,0x007F,0xE000,0x0000,0x0000,0x01FF,0x800F,0xF000,0x0000,0x0000,0x0000,
  256.     0x7FE0,0x03FE,0x0000,0x007F,0xE000,0x0000,0x0000,0x01FF,0x800F,0xF800,0x0000,0x0000,0x0000,
  257.     0x7FE0,0x01FE,0x0000,0x00FF,0xE000,0x0000,0x0000,0x01FF,0x8007,0xF800,0x0000,0x0000,0x0000,
  258.     0x0000,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0007,0xFC00,0x0000,0x0000,0x0000,
  259.     0x0000,0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0xFC00,0x0000,0x0000,0x0000,
  260.     0x0000,0x00FF,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0xFE00,0x0000,0x0000,0x0000,
  261.     0x0000,0x007F,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0xFE00,0x0000,0x0000,0x0000,
  262.     0x0000,0x007F,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0xFF00,0x0000,0x0000,0x0000,
  263.     0x0000,0x003F,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF00,0x0000,0x0000,0x0000,
  264.     0x0000,0x003F,0xE000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF80,0x0000,0x0000,0x0000,
  265.     0x0000,0x001F,0xE000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7F80,0x0000,0x0000,0x0000,
  266.     0x0000,0x001F,0xF000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7FC0,0x0000,0x0000,0x0000,
  267.     0x0000,0x000F,0xF0F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FC3,0xC000,0x0000,0x0000,
  268.     0x0000,0x000F,0xF9F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FE7,0xC000,0x0000,0x0000,
  269.     0x0000,0x0007,0xFFF0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1FFF,0xC000,0x0000,0x0000,
  270.     0x0000,0x0003,0xFFE0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0FFF,0x8000,0x0000,0x0000,
  271.     0x0000,0x0003,0xFFE0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0FFF,0x8000,0x0000,0x0000,
  272.     0x0000,0x0001,0xFFC0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FF,0x0000,0x0000,0x0000,
  273.     0x0000,0x0000,0xFF80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03FE,0x0000,0x0000,0x0000,
  274.     0x0000,0x0000,0x3F00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00FC,0x0000,0x0000,0x0000,
  275.     0x0000,0x0000,0x3E00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x00F8,0x0000,0x0000,0x0000,
  276.     /* Plane 1 */
  277.     0x3FFF,0xF000,0x0000,0x0000,0x0000,0x0000,0x7FF0,0x00FF,0xFFC0,0x00FF,0xFFFF,0x0000,0x000F,
  278.     0x3FFF,0xFE00,0x3FFF,0xFFFF,0xFFF0,0x0003,0xFFFE,0x00FF,0xFFF8,0x00FF,0xFFFF,0x0000,0x000F,
  279.     0x3FFF,0xFF80,0x3FFF,0xFFFF,0xFFFE,0x0007,0xFFFF,0x00FF,0xFFFE,0x00FF,0xFFFF,0x0000,0x000F,
  280.     0x3FFF,0xFF80,0x3FFF,0xFFFF,0xFFFF,0x800F,0xFFFF,0x00FF,0xFFFE,0x00FF,0xFFFF,0x0001,0xE00F,
  281.     0x3FFF,0xFFC0,0x3FFF,0xFFFF,0xFFFF,0xC01F,0xFFFF,0x80FF,0xFFFF,0x00FF,0xFFFF,0x001F,0xE00F,
  282.     0x3FFF,0xFFE0,0x3FFF,0xFFFF,0xFFFF,0xE03F,0xFFFF,0xC0FF,0xFFFF,0x80FF,0xFFFF,0x001F,0xE00F,
  283.     0x3FC0,0x7FF0,0x3F00,0x003F,0xC07F,0xF03F,0xE07F,0xC0FF,0x01FF,0xC080,0x7F80,0x001F,0xE00F,
  284.     0x3FC0,0x0FF0,0x3F00,0x003F,0xC00F,0xF07F,0xC07F,0xE0FF,0x003F,0xC000,0xFF80,0x001F,0xE00F,
  285.     0x3FC0,0x07F8,0x3F00,0x003F,0xC007,0xF87F,0x801F,0xE0FF,0x001F,0xE000,0xFF80,0x001F,0xE00F,
  286.     0x3FC0,0x07F8,0x3F00,0x003F,0xC007,0xF87F,0x001F,0xE0FF,0x001F,0xE000,0xFF80,0x001F,0xE00F,
  287.     0x3FC0,0x07F8,0x3F00,0x003F,0xC007,0xF8FF,0x000F,0xF0FF,0x001F,0xE000,0xFF80,0x001F,0xE0EF,
  288.     0x3FC0,0x07F8,0x3F7F,0xE03F,0xC007,0xF8FF,0x000F,0xF0FF,0x001F,0xE000,0xFF80,0x001F,0xE7EF,
  289.     0x3FC0,0x07F8,0x3FFF,0xC03F,0xC007,0xF8FF,0x000F,0xF0FF,0x001F,0xE000,0xFF80,0x001F,0xFFEF,
  290.     0x3FC0,0x0FF0,0x3FFF,0x803F,0xC00F,0xF0FF,0x000F,0xF0FF,0x003F,0xC000,0xFF80,0x001F,0xFFEF,
  291.     0x3FC0,0x1FF0,0x3FFF,0x003F,0xC01F,0xF0FF,0x000F,0xF0FF,0x007F,0xC000,0xFF80,0x007F,0xFFCF,
  292.     0x3FC0,0x7FE0,0x3FFE,0x003F,0xC07F,0xE0FF,0x000F,0xF0FF,0x01FF,0x8000,0xFF80,0x03FF,0xFF0F,
  293.     0x3FDF,0xFFC0,0x3FFC,0x003F,0xDFFF,0xC0FF,0x000F,0xF0FF,0x7FFF,0x0000,0xFF80,0x1FFF,0xF80F,
  294.     0x3FFF,0xFF80,0x3FF8,0x003F,0xFFFF,0x80FF,0x000F,0xF0FF,0xFFFE,0x0000,0xFF80,0x1FFF,0xE00F,
  295.     0x3FFF,0xFF00,0x3F00,0x003F,0xFFFF,0x00FF,0x000F,0xF0FF,0xFFFC,0x0000,0xFF80,0x1FFF,0xE00F,
  296.     0x3FFF,0xFE00,0x3F00,0x003F,0xFFFE,0x00FF,0x000F,0xF0FF,0xFFF8,0x0000,0xFF80,0x1F8F,0xE00F,
  297.     0x3FFF,0xFC00,0x3F00,0x003F,0xFFFC,0x00FF,0x000F,0xE0FF,0xFFF0,0x0000,0xFF80,0x1C1F,0xE00F,
  298.     0x3FFF,0xFC00,0x3F00,0x003F,0xFFE0,0x007F,0x800F,0xE0FF,0xFFF0,0x0000,0xFF80,0x101F,0xE00F,
  299.     0x3FC1,0xFC00,0x3F00,0x003F,0xC000,0x007F,0x801F,0xE0FF,0x07F0,0x0000,0xFF80,0x001F,0xE00F,
  300.     0x3FC3,0xFE00,0x3F00,0x003F,0xC000,0x007F,0xF03F,0xC0FF,0x0FF8,0x0000,0xFF80,0x001F,0xE00F,
  301.     0x3FC1,0xFE00,0x3F7F,0xFF3F,0xC000,0x003F,0xFFFF,0xC0FF,0x07F8,0x0000,0xFF80,0x001F,0xE00F,
  302.     0x3FC1,0xFF00,0x3FFF,0xFE3F,0xC000,0x003F,0xFFFF,0x80FF,0x07FC,0x0000,0xFF80,0x001F,0xE00F,
  303.     0x3FC0,0xFF00,0x3FFF,0xFC3F,0xC000,0x001F,0xFFFF,0x00FF,0x03FC,0x0000,0xFF00,0x001F,0xC00F,
  304.     0x3FC0,0xFF80,0x3FFF,0xF83F,0xC000,0x0007,0xFFFE,0x00FF,0x03FE,0x0000,0xFE00,0x001E,0x000F,
  305.     0x3FC0,0x7F80,0x3FFF,0xF03F,0xC000,0x0003,0xFFFC,0x00FF,0x01FE,0x0000,0xFC00,0x0010,0x000F,
  306.     0x3FC0,0x7FC0,0x3FFF,0xE03F,0xC000,0x0000,0x7FE0,0x00FF,0x01FF,0x0000,0xF800,0x0000,0x000F,
  307.     0x3FC0,0x3FC0,0x2000,0x003F,0xC000,0x0000,0x0000,0x00FF,0x00FF,0x0000,0xF000,0x0000,0x000F,
  308.     0x3FC0,0x3FE0,0x0000,0x003F,0xC000,0x0000,0x0000,0x00FF,0x00FF,0x8000,0xE000,0x0000,0x000F,
  309.     0x3FC0,0x1FE0,0x0000,0x003F,0xC000,0x0000,0x0000,0x00FF,0x007F,0x8000,0xC000,0x0000,0x000F,
  310.     0x3FC0,0x1FF0,0x0000,0x003F,0xC000,0x0000,0x0000,0x00FF,0x007F,0xC000,0x8000,0x0000,0x000F,
  311.     0xFFC0,0x0FF0,0x0000,0x00FF,0xC000,0x0000,0x0000,0x03FF,0x003F,0xC000,0x0000,0x0000,0x000F,
  312.     0xFFC0,0x0FF8,0x0000,0x00FF,0xC000,0x0000,0x0000,0x03FF,0x003F,0xE000,0x0000,0x0000,0x000F,
  313.     0xFFC0,0x07F8,0x0000,0x00FF,0xC000,0x0000,0x0000,0x03FF,0x001F,0xE000,0x0000,0x0000,0x000F,
  314.     0xFFC0,0x07FC,0x0000,0x00FF,0xC000,0x0000,0x0000,0x03FF,0x001F,0xF000,0x0000,0x0000,0x000F,
  315.     0x8000,0x03FC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0200,0x000F,0xF000,0x0000,0x0000,0x000F,
  316.     0x0000,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000F,0xF800,0x0000,0x0000,0x000F,
  317.     0x0000,0x01FE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0007,0xF800,0x0000,0x0000,0x000F,
  318.     0x0000,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0007,0xFC00,0x0000,0x0000,0x000F,
  319.     0x0000,0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0xFC00,0x0000,0x0000,0x000F,
  320.     0x0000,0x00FF,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0xFE00,0x0000,0x0000,0x000F,
  321.     0x0000,0x007F,0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0xFE00,0x0000,0x0000,0x000F,
  322.     0x0000,0x007F,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0xFF00,0x0000,0x0000,0x000F,
  323.     0x0000,0x003F,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF00,0x0000,0x0000,0x000F,
  324.     0x0000,0x003F,0xE0F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFF83,0xC000,0x0000,0x000F,
  325.     0x0000,0x001F,0xE1E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7F87,0x8000,0x0000,0x000F,
  326.     0x0000,0x001F,0xF3E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7FCF,0x8000,0x0000,0x000F,
  327.     0x0000,0x000F,0xFBE0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FEF,0x8000,0x0000,0x000F,
  328.     0x0000,0x0007,0xFFC0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1FFF,0x0000,0x0000,0x000F,
  329.     0x0000,0x0007,0xFFC0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1FFF,0x0000,0x0000,0x000F,
  330.     0x0000,0x0003,0xFF80,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0FFE,0x0000,0x0000,0x000F,
  331.     0x0000,0x0001,0xFF00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FC,0x0000,0x0000,0x000F,
  332.     0x0000,0x0000,0xFE00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03F8,0x0000,0x0000,0x000F,
  333.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x000F,
  334. };
  335. MODULE UWORD chip PalAboutData[66] =
  336. {   0xFFFF,0xFFFF,0xFFF8,
  337.     0xFDFF,0xC7FF,0xFFF8,
  338.     0xE53F,0x83FF,0xFFF8,
  339.     0xF8FF,0x01FF,0xFFF8,
  340.     0xE53E,0x10FF,0xFBF8,
  341.     0xFDFC,0x387F,0x9B38,
  342.     0xFFF8,0x7C3F,0xE0F8,
  343.     0xC3F0,0x0000,0x0018,
  344.     0xE1E0,0x1F0F,0xE0F8,
  345.     0xF0C3,0xE387,0x9B38,
  346.     0xF807,0xFC43,0xFBF8,
  347.     0xFC0F,0xFF81,0xFFF8,
  348.     0xFE1F,0xFFF0,0xFFF8,
  349.     0xFFFF,0xFFFF,0xFFF8,
  350.     0xFFFF,0xFFFF,0xFFF8,
  351.     0xF1C4,0x6C0E,0x39D8,
  352.     0xEEDB,0x6BFD,0xDAD8,
  353.     0xE0DB,0x6B8C,0x1B58,
  354.     0xDF5F,0x6BEB,0xEB98,
  355.     0xDF5F,0x6C0B,0xEBD8,
  356.     0xFFFF,0xFFFF,0xFFF8,
  357.     0xFFFF,0xFFFF,0xFFF8
  358. };
  359. MODULE UWORD chip PubAboutData[132] =
  360. {   0xFFFF,0xFFFF,0xFFE0,
  361.     0xFFFF,0xFFFF,0xFFE0,
  362.     0xFFFF,0xFFFF,0xFFE0,
  363.     0xFFFF,0xFFFF,0xFFE0,
  364.     0xFBFF,0x8FFF,0xFFE0,
  365.     0xFBFF,0x8FFF,0xFFE0,
  366.     0xCA7F,0x07FF,0xFFE0,
  367.     0xCA7F,0x07FF,0xFFE0,
  368.     0xF1FE,0x03FF,0xFFE0,
  369.     0xF1FE,0x03FF,0xFFE0,
  370.     0xCA7C,0x21FF,0xF7E0,
  371.     0xCA7C,0x21FF,0xF7E0,
  372.     0xFBF8,0x70FF,0x3660,
  373.     0xFBF8,0x70FF,0x3660,
  374.     0xFFF0,0xF87F,0xC1E0,
  375.     0xFFF0,0xF87F,0xC1E0,
  376.     0x87E0,0x0000,0x0020,
  377.     0x87E0,0x0000,0x0020,
  378.     0xC3C0,0x3E1F,0xC1E0,
  379.     0xC3C0,0x3E1F,0xC1E0,
  380.     0xE187,0xC70F,0x3660,
  381.     0xE187,0xC70F,0x3660,
  382.     0xF00F,0xF887,0xF7E0,
  383.     0xF00F,0xF887,0xF7E0,
  384.     0xF81F,0xFF03,0xFFE0,
  385.     0xF81F,0xFF03,0xFFE0,
  386.     0xFC3F,0xFFE1,0xFFE0,
  387.     0xFC3F,0xFFE1,0xFFE0,
  388.     0xFFFF,0xFFFF,0xFFE0,
  389.     0xFFFF,0xFFFF,0xFFE0,
  390.     0xE1C8,0xDC38,0x6EE0,
  391.     0xE1C8,0xDC38,0x6EE0,
  392.     0xDDB6,0xDBF7,0x66E0,
  393.     0xDDB6,0xDBF7,0x66E0,
  394.     0xC1B6,0xDB30,0x6AE0,
  395.     0xC1B6,0xDB30,0x6AE0,
  396.     0xDDBE,0xDBB7,0x6CE0,
  397.     0xDDBE,0xDBB7,0x6CE0,
  398.     0xDDBE,0xD877,0x6EE0,
  399.     0xDDBE,0xD877,0x6EE0,
  400.     0xFFFF,0xFFFF,0xFFE0,
  401.     0xFFFF,0xFFFF,0xFFE0,
  402.     0xFFFF,0xFFFF,0xFFE0,
  403.     0xFFFF,0xFFFF,0xFFE0
  404. };
  405. #ifdef __STORM__
  406.    #pragma chip
  407. #endif
  408.  
  409. AGLOBAL struct NewGadget Gadget =
  410. {   0, 0,                                   /* left-x, top-y */
  411.     0, 0,                                   /* width, height */
  412.     0,                                      /* text */
  413.     NULL,                                   /* font */
  414.     NULL,                                   /* gadget ID */
  415.     NULL,                                   /* flags */
  416.     NULL,                                   /* visual info */
  417.     NULL                                    /* user data */
  418. };
  419.  
  420. #define ABOUTLINES      6
  421. #define ABOUTSHADOW BLACK
  422. #define ABOUTSHINE  WHITE
  423.  
  424. MODULE struct
  425. {   WORD   x, y;
  426.     STRPTR text;
  427. } about[ABOUTLINES + 1] =
  428. {   {80,  27, TITLEBARTEXT,           },
  429.     {80,  35, "Friday 29 June 2001"   },
  430.     {80,  43, "© 2001 Amigan Software"},
  431.     {80,  59, "By James R. Jacobs"    },
  432.     {80,  75, "Kickstart: "           },
  433.     {80,  83, "Workbench: "           },
  434.     {80, 106, "Public Screen: RPLUS"  }
  435. };
  436. MODULE STRPTR FunctionOptions[FUNCTIONS + 1] =
  437. {   "Bug report",
  438.     "Aminet readme",
  439.     "ACSE test",
  440.     "Autodoc",
  441.     "ID database",
  442.     "IFF registry",
  443.     "EOL/tab converter",
  444.     "Path size report",
  445.     "Battery RAM",
  446.     "System file report",
  447.     "_AGDB review",
  448.     "_Icon processor",
  449.     NULL
  450. };
  451. #define MENUENTRIES 13
  452. MODULE struct NewMenu NewMenu[MENUENTRIES] =
  453. {   { NM_TITLE, "Project",       0 , 0,               0, 0},
  454.     {  NM_ITEM, "New",          "N", NM_ITEMDISABLED, 0, 0},
  455.     {  NM_ITEM, "Open...",      "O", NM_ITEMDISABLED, 0, 0},
  456.     {  NM_ITEM, NM_BARLABEL,     0 , 0,               0, 0},
  457.     {  NM_ITEM, "Save",         "S", NM_ITEMDISABLED, 0, 0},
  458.     {  NM_ITEM, "Save As...",   "O", NM_ITEMDISABLED, 0, 0},
  459.     {  NM_ITEM, NM_BARLABEL,     0 , 0,               0, 0},
  460.     {  NM_ITEM, "Quit Report+", "Q", 0,               0, 0},
  461.     { NM_TITLE, "Help",          0 , 0,               0, 0},
  462.     {  NM_ITEM, "Manual...",    "M", 0,               0, 0},
  463.     {  NM_ITEM, NM_BARLABEL,     0 , 0,               0, 0},
  464.     {  NM_ITEM, "About...",     "?", 0,               0, 0},
  465.     {   NM_END, NULL,            0 , 0,               0, 0}
  466. };
  467.  
  468. MODULE void clearkybd(void);
  469. MODULE void helpabout(void);
  470. MODULE void menu(void);
  471. MODULE void parsewb(void);
  472. MODULE void eachwildcard(STRPTR subpattern);
  473. MODULE void double_exit(void);
  474.  
  475. int CXBRK(void) { return(0); }    /* Disable SAS/C Ctrl-C handling */
  476. int chkabort(void) { return(0); } /* really */
  477.  
  478. AGLOBAL struct Library          *WindowBase      = NULL,
  479.                                 *LayoutBase      = NULL,
  480.                                 *ButtonBase      = NULL,
  481.                                 *TextEditorBase  = NULL,
  482.                                 *LabelBase       = NULL,
  483.                                 *ListBrowserBase = NULL,
  484.                                 *ChooserBase     = NULL,
  485.                                 *StringBase      = NULL,
  486.                                 *CheckBoxBase    = NULL,
  487.                                 *BoardsBase      = NULL;
  488. AGLOBAL ABOOL                   done             = FALSE,
  489.                                 pal              = FALSE,
  490.                                 fillwindows      = TRUE,
  491.                                 react            = FALSE,
  492.                                 stop             = FALSE;
  493. AGLOBAL TEXT                    asldir[VLONGFIELD + 1],
  494.                                 aslresult[VLONGFIELD + 1],
  495.                                 IOBuffer[LONGESTFIELD + 1],
  496.                                 globalname[VLONGFIELD + 1],
  497.                                 string[VLONGFIELD + 1],
  498.                                 weekdaystring[LEN_DATSTRING],
  499.                                 datestring[LEN_DATSTRING],
  500.                                 timestring[LEN_DATSTRING];
  501. AGLOBAL SBYTE                   page             = 0;
  502. AGLOBAL ULONG                   fillcolour,
  503.                                 elements, /* for ReAction texteditor.gadget */
  504.                                 offset,
  505.                                 wbval;
  506. AGLOBAL ABOOL                   BattBuffer[96];
  507. AGLOBAL APTR                    OldWindowPtr     = NULL;
  508. AGLOBAL struct Library*         IconBase         = NULL;
  509. AGLOBAL struct Menu*            MenuPtr          = NULL;
  510. AGLOBAL struct Process*         ProcessPtr       = NULL;
  511. AGLOBAL struct Screen*          ScreenPtr        = NULL;
  512. AGLOBAL struct Window*          MainWindowPtr    = NULL;
  513. AGLOBAL struct VisualInfo*      VisualInfoPtr    = NULL;
  514. AGLOBAL struct ExAllData*       EADataPtr        = NULL;
  515. AGLOBAL struct Gadget          *BU99_Right       = NULL,
  516.                                *ST99_Output      = NULL,
  517.                                *BU99_OutputASL   = NULL,
  518.                                *CB99_Log         = NULL,
  519.                                *BU99_Update      = NULL,
  520.                                *BU99_Stop        = NULL,
  521.                                *BU99_TextEditor  = NULL,
  522.                                *GListPtr         = NULL,
  523.                                *PrevGadPtr       = NULL;
  524. AGLOBAL struct SharedStruct shared =
  525. {   TRUE, 0,
  526.     "", "", "", "", "", ""
  527. };
  528.  
  529. // from f9.c
  530. IMPORT struct Library*          BattMemBase;
  531.  
  532. MODULE  WORD                    xsize;
  533. AGLOBAL WORD                    ysize;
  534. MODULE  ULONG                   ksval;
  535. MODULE  struct RDArgs*          ArgsPtr           = NULL;
  536. MODULE  struct TextFont*        FontPtr           = NULL;
  537. MODULE  struct Window          *BkgrndWindowPtr   = NULL;
  538. MODULE  struct Gadget          *TE00_FunctionText[FUNCTIONS] =
  539.         {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
  540.                                *MX00_Function     = NULL,
  541.                                *ST00_Editor       = NULL,
  542.                                *BU00_EditorASL    = NULL;
  543. MODULE  struct WBArg*           WBArg             = NULL;
  544. MODULE  struct WBStartup*       WBMsg             = NULL;
  545. MODULE  struct TextAttr         Topaz8 =
  546. {    (STRPTR) "topaz.font", 8, FS_NORMAL, FPF_ROMFONT | FPF_DESIGNED
  547. }, /* "topaz.font" is case-sensitive */ WormWars8 =
  548. {    (STRPTR) "WormWars.font", 8, FS_NORMAL, FPF_DISKFONT | FPF_DESIGNED
  549. };
  550. MODULE  struct ASLBase*         ASLBase         = NULL;
  551. MODULE  struct DiskFontBase*    DiskFontBase    = NULL;
  552. MODULE  struct Library*         GadToolsBase    = NULL;
  553. MODULE  struct IntuitionBase*   IntuitionBase   = NULL;
  554. MODULE  struct Library*         VersionBase     = NULL;
  555. MODULE  struct Image
  556. PalLogo =
  557. {   0, 0,
  558.     204, 29, 2,
  559.     PalLogoData,
  560.     0x3, BLACK,
  561.     NULL
  562. }, PubLogo =
  563. {   0, 0,
  564.     204, 57, 2,
  565.     PubLogoData,
  566.     0x3, BLACK,
  567.     NULL
  568. }, PalAbout =
  569. {   0, 0,
  570.     43, 22, 1,
  571.     PalAboutData,
  572.     0x4, 3,
  573.     NULL
  574. }, PubAbout =
  575. {   0, 0,
  576.     43, 44, 1,
  577.     PubAboutData,
  578.     0x1, 3,
  579.     NULL
  580. };
  581. MODULE  struct EasyStruct       EasyStruct =
  582. {   sizeof(struct EasyStruct),
  583.     0,
  584.     "Report+: Error",
  585.     NULL,
  586.     "Quit"
  587. };
  588.  
  589. IMPORT ABOOL               certified, quit;
  590. IMPORT struct ReportStruct report;
  591. IMPORT struct AminetStruct aminet;
  592. IMPORT struct AGDBStruct   agdb;
  593. IMPORT struct IFFStruct    iff;
  594. IMPORT struct EOLStruct    eol;
  595. IMPORT struct IconStruct   icon;
  596. IMPORT struct ExecBase*    SysBase;
  597. IMPORT struct Object*      object;
  598. IMPORT ULONG               app, signal;
  599. IMPORT struct Gadget      *TE71_Status,
  600.                           *gadgets[GIDS_12 + 1];
  601.  
  602. /* FUNCTIONS -------------------------------------------------------------- */
  603.  
  604. int main(int argc, char** argv)
  605. {   UWORD Pens[10] =
  606.     {   BLACK,     /* DETAILPEN        text in title bar */
  607.         WHITE,     /* BLOCKPEN         fill title bar */
  608.         BLACK,     /* TEXTPEN          regular text on BACKGROUNDPEN */
  609.         WHITE,     /* SHINEPEN         bright edge */
  610.         BLACK,     /* SHADOWPEN        dark edge */
  611.         ORANGE,    /* FILLPEN          filling active window borders
  612.                                        and selected gadgets */
  613.         BLACK,     /* FILLTEXTPEN      text rendered over FILLPEN */
  614.         LIGHTGREY, /* BACKGROUNDPEN    background colour */
  615.         WHITE,     /* HIGHLIGHTTEXTPEN highlighted text on BACKGROUNDPEN */
  616.         (UWORD) ~0
  617.     };
  618.     struct ColorSpec Colours[17] =
  619.     {   /* colour   red   green     blue    description */
  620.         {    0,     0x9,    0x8,    0xA},   /* GREY */
  621.         {    1,     0x0,    0x0,    0x0},   /* BLACK */
  622.         {    2,     0xF,    0xF,    0xF},   /* WHITE */
  623.         {    3,     0xF,    0x7,    0x7},   /* RED */
  624.         {    4,     0x6,    0x6,    0xF},   /* BLUE */          
  625.         {    5,     0xC,    0xB,    0xD},   /* LIGHTGREY */
  626.         {    6,     0xF,    0xA,    0x6},   /* ORANGE */
  627.         {    7,     0xF,    0xF,    0x5},   /* YELLOW */
  628.         {    8,     0xF,    0x2,    0x2},   /* red */
  629.         {    9,     0xF,    0x8,    0x0},   /* orange */
  630.         {   10,     0xF,    0xF,    0x0},   /* yellow */
  631.         {   11,     0x5,    0xF,    0x5},   /* green */
  632.         {   12,     0x5,    0x5,    0xF},   /* blue (obsolete) */
  633.         {   13,     0x0,    0xF,    0xF},   /* cyan (3rd-party) */
  634.         {   14,     0xB,    0xF,    0xB},   /* LIGHTGREEN */
  635.         {   15,     0x9,    0x9,    0xF},   /* sky blue */
  636.         {   -1,    NULL,   NULL,   NULL}
  637.     };
  638.     UWORD  i;
  639.     SLONG  args[13] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L };
  640.     BPTR   OldDir;
  641.     SLONG  number = 0, hostid = 7;
  642.  
  643.     /* Start of program.
  644.  
  645.     version embedding into executable */
  646.  
  647.     if (0) /* that is, never */
  648.         Printf("$VER: Report+ 4.7 (29.6.2001"); /* this is always d.m.y format */
  649.  
  650.     if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 38L)))
  651.     {   Printf("Report+: Need intuition.library V38+!\n");
  652.         cleanexit(EXIT_FAILURE);
  653.     }
  654.     if ((ksval = SysBase->LibNode.lib_Version) < 38L)
  655.     {   Printf("Report+: Need exec.library V38+!\n");
  656.         cleanexit(EXIT_FAILURE);
  657.     }
  658.  
  659.     /* From this point onwards, we can be sure we have Kickstart 2.1+... */
  660.  
  661.     autodoc_init();
  662.     size_init();
  663.     batt_init();
  664.  
  665.     if (!(VersionBase = (struct Library *) OpenLibrary("version.library", 0L)))
  666.         rq("Can't open version.library!");
  667.     wbval = VersionBase->lib_Version;
  668.     CloseLibrary((struct Library *) VersionBase);
  669.     VersionBase = NULL;
  670.  
  671.     if (!(GadToolsBase = (struct Library *) OpenLibrary("gadtools.library", 38L)))
  672.         rq("Can't open GadTools.library V38+!");
  673.     if (!(ASLBase = (struct ASLBase *) OpenLibrary("asl.library", 0L)))
  674.         rq("Can't open ASL.library!");
  675.     if (
  676.         (DiskFontBase = (struct DiskFontBase *) OpenLibrary("diskfont.library", 0L))
  677.     &&  (FontPtr = OpenDiskFont(&WormWars8))
  678.        )
  679.     {   Gadget.ng_TextAttr = (struct TextAttr *) &WormWars8;
  680.     } elif (!(FontPtr = OpenFont(&Topaz8)))
  681.     {   rq("Can't open fonts!");
  682.     } else
  683.     {   Gadget.ng_TextAttr = (struct TextAttr *) &Topaz8;
  684.     }
  685.  
  686.     if (wbval >= 44)
  687.     {   react = TRUE;
  688.         if (!(ButtonBase      = OpenLibrary("gadgets/button.gadget", 44)))
  689.                            rq("OpenLibrary(\"gadgets/button.gadget\") failed!");
  690.         if (!(CheckBoxBase    = OpenLibrary("gadgets/checkbox.gadget", 44)))
  691.                            rq("OpenLibrary(\"gadgets/checkbox.gadget\") failed!");
  692.         if (!(ChooserBase     = OpenLibrary("gadgets/chooser.gadget", 44)))
  693.                            rq("OpenLibrary(\"gadgets/chooser.gadget\") failed!");
  694.         if (!(LabelBase       = OpenLibrary("images/label.image", 44)))
  695.                            rq("OpenLibrary(\"images/label.image\") failed!");
  696.         if (!(LayoutBase      = OpenLibrary("gadgets/layout.gadget", 44)))
  697.                            rq("OpenLibrary(\"gadgets/layout.gadget\") failed!");
  698.         if (!(ListBrowserBase = OpenLibrary("gadgets/listbrowser.gadget", 0)))
  699.                            rq("OpenLibrary(\"gadgets/listbrowser.gadget\") failed!");
  700.         if (!(StringBase      = OpenLibrary("gadgets/string.gadget", 44)))
  701.                            rq("OpenLibrary(\"gadgets/string.gadget\") failed!");
  702.         if (!(TextEditorBase  = OpenLibrary("gadgets/texteditor.gadget", 0)))
  703.                            rq("OpenLibrary(\"gadgets/texteditor.gadget\") failed!");
  704.         if (!(WindowBase      = OpenLibrary("window.class", 44)))
  705.                            rq("OpenLibrary(\"window.class\") failed!");
  706.         if (!(IconBase        = OpenLibrary("icon.library", 44L)))
  707.                            rq("Need icon.library V44+!");
  708.     }
  709.  
  710.     BoardsBase = OpenLibrary("boards.library", 0L);
  711.  
  712.     report_init();
  713.     newaminet(FALSE);
  714.     newagdb(FALSE);
  715.     /* those must be done before we handle CLI arguments */
  716.  
  717.     if (argc) /* started from CLI */
  718.     {   if (!(ArgsPtr = ReadArgs
  719.         (   "-P=PAL/S,-G=GREY/S,-E=EDITOR/S,FUNCTION/N,ICONTYPE/K,"
  720.             "RESET/S,TIMEOUT/S,LUNS/S,SYNC_XFER/S,SLOW_SYNC/S,TAG_QUEUES/S,HOST_ID/K/N,"
  721.             "FILE/F",
  722.             (LONG *) args,
  723.             NULL
  724.     )))
  725.         {   Printf
  726.             (   "Usage: %s [-p=PAL] [-g=GREY] [-e=EDITOR] "
  727.                 "[[FUNCTION] <function> "
  728.                 "[ICONTYPE DISK|DRAWER|TOOL|PROJECT|TRASHCAN|DEVICE|KICKSTART|APPICON] "
  729.                 "[RESET [TIMEOUT] [LUNS] [SYNC_XFER] [SLOW_SYNC] [TAG_QUEUES] [HOST_ID <host_id>]] "
  730.                 "[[FILE] <file(s)...>]]\n",
  731.                 argv[0]
  732.             );
  733.             cleanexit(EXIT_FAILURE);
  734.     }
  735.         if (args[0])
  736.             pal = TRUE;
  737.         if (args[1])
  738.             fillwindows = FALSE;
  739.         if (args[2])
  740.         {   react = FALSE;
  741.         }
  742.         if (args[3])
  743.         {   number = (SLONG) (*((SLONG *) args[3]));
  744.             if (number == 12)
  745.             {   if (wbval < 44)
  746.                 {   Printf("Report+: Icon converter requires OS3.5+!\n");
  747.                     cleanexit(EXIT_FAILURE);
  748.                 }
  749.                 if (pal)
  750.                 {   Printf("Report+: Icon converter doesn't support PAL mode!\n");
  751.                     cleanexit(EXIT_FAILURE);
  752.             }   }
  753.             if (number >= 1 && number <= FUNCTIONS)
  754.             {   page = (number * 10) + 1;
  755.                 shared.function = number - 1;
  756.             } else
  757.             {   Printf("Report+: <function> must be 1-%ld!\n", FUNCTIONS);
  758.                 cleanexit(EXIT_FAILURE);
  759.         }   }
  760.         if (args[4])
  761.         {   if (number != 12)
  762.             {   Printf("%s: <function> must be 12 for this!\n", argv[0]);
  763.                 cleanexit(EXIT_FAILURE);
  764.                 if (!stricmp((STRPTR) args[4], "DISK"))
  765.                 {   icon.type = WBDISK - 1;
  766.                 } elif (!stricmp((STRPTR) args[4], "DRAWER"))
  767.                 {   icon.type = WBDRAWER - 1;
  768.                 } elif (!stricmp((STRPTR) args[4], "TOOL"))
  769.                 {   icon.type = WBTOOL - 1;
  770.                 } elif (!stricmp((STRPTR) args[4], "PROJECT"))
  771.                 {   icon.type = WBPROJECT - 1;
  772.                 } elif (!stricmp((STRPTR) args[4], "TRASHCAN"))
  773.                 {   icon.type = WBGARBAGE - 1;
  774.                 } elif (!stricmp((STRPTR) args[4], "DEVICE"))
  775.                 {   icon.type = WBDEVICE - 1;
  776.                 } elif (!stricmp((STRPTR) args[4], "KICKSTART"))
  777.                 {   icon.type = WBKICK - 1;
  778.                 } elif (!stricmp((STRPTR) args[4], "APPICON"))
  779.                 {   icon.type = WBAPPICON - 1;
  780.                 } else
  781.                 {   Printf("%s: <icontype> must be DISK, DRAWER, TOOL, PROJECT, TRASHCAN, DEVICE, KICKSTART or APPICON!\n", argv[0]);
  782.                     cleanexit(EXIT_FAILURE);
  783.         }   }   }
  784.         if (args[5] || args[6] || args[7] || args[8] || args[9] || args[10] || args[11])
  785.         {   if (number != 9)
  786.             {   Printf("%s: <function> must be 9 for this!\n", argv[0]);
  787.                 cleanexit(EXIT_FAILURE);
  788.             }
  789.             if (!args[5])
  790.             {   Printf("%s: You need the RESET switch for this!\n", argv[0]);
  791.                 cleanexit(EXIT_FAILURE);
  792.             }
  793.             for (i = 0; i <= 95; i++)
  794.             {   BattBuffer[i] = FALSE;
  795.             }
  796.             BattBuffer[BATTMEM_AMIGA_AMNESIA_ADDR]          =
  797.             BattBuffer[BATTMEM_SHARED_AMNESIA_ADDR]         = TRUE; // these bits are inverted
  798.             if (args[6])
  799.             {   BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR]       = TRUE;
  800.             } else BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR]    = FALSE;
  801.             if (args[7])
  802.             {   BattBuffer[BATTMEM_SCSI_LUNS_ADDR]          = TRUE;
  803.             } else BattBuffer[BATTMEM_SCSI_LUNS_ADDR]       = FALSE;
  804.             if (args[8])
  805.             {   BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR]     = TRUE;
  806.             } else BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR]  = FALSE;
  807.             if (args[9])
  808.             {   BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR]     = TRUE;
  809.             } else BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR]  = FALSE;
  810.             if (args[10])
  811.             {   BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR]    = TRUE;
  812.             } else BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR] = FALSE;
  813.             if (args[11]) // these bits are inverted
  814.             {   hostid = (SLONG) (*((SLONG *) args[11]));
  815.                 if (hostid < 0 || hostid > 7)
  816.                 {   Printf("%s: <host_id> must be 0-7!\n", argv[0]);
  817.                     cleanexit(EXIT_FAILURE);
  818.                 }
  819.                 BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR]     = (hostid & 4)? 0 : 1;
  820.                 BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 1] = (hostid & 2)? 0 : 1;
  821.                 BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 2] = (hostid & 1)? 0 : 1;
  822.             }
  823.             if (!BattMemBase)
  824.             {   if (!(BattMemBase = OpenResource(BATTMEMNAME)))
  825.                 {   rq("Can't open battery RAM resource!");
  826.             }   }
  827.             writebatt(FALSE);
  828.             Printf("Done.\n");
  829.             cleanexit(EXIT_SUCCESS);
  830.         }
  831.         if (args[12])
  832.         {   switch(number)
  833.             {
  834.             case 1:
  835.                 strcpy(report.output, (STRPTR) args[12]);
  836.                 report.loaded = TRUE;
  837.                 loadreport();
  838.             break;
  839.             case 2:
  840.                 strcpy(aminet.output, (STRPTR) args[12]);
  841.                 aminet.loaded = TRUE;
  842.                 loadaminet();
  843.             break;
  844.             case 6:
  845.                 strcpy(iff.pathname, (STRPTR) args[12]);
  846.             break;
  847.             case 7:
  848.                 strcpy(shared.pathname, (STRPTR) args[12]);
  849.                 convert(FALSE);
  850.                 Printf("All done.\n");
  851.                 cleanexit(EXIT_SUCCESS);
  852.             break;
  853.             case 11:
  854.                 strcpy(  agdb.output, (STRPTR) args[12]);
  855.                 agdb.loaded = TRUE;
  856.                 loadagdb();
  857.             break;
  858.             case 12:
  859.                 strcpy(shared.pathname, (STRPTR) args[12]);
  860.                 convert(FALSE);
  861.                 Printf("All done.\n");
  862.                 cleanexit(EXIT_SUCCESS);
  863.             break;
  864.             default:
  865.                 Printf("Report+: <function> must be 1, 2, 6, 7, 11 or 12 for this!\n");
  866.                 cleanexit(EXIT_FAILURE);
  867.             break;
  868.     }   }   }
  869.     else /* started from WB */
  870.     {   WBMsg = (struct WBStartup *) argv;
  871.         WBArg = WBMsg->sm_ArgList; /* head of the arg list */
  872.         for (i = 0; i < WBMsg->sm_NumArgs; i++, WBArg++)
  873.         {   if (WBArg->wa_Lock)
  874.             {   /* something that does not support locks */
  875.                 parsewb();
  876.             } else
  877.             {   /* lock supported; change to the proper directory */
  878.                 OldDir = CurrentDir(WBArg->wa_Lock);
  879.                 parsewb();
  880.                 CurrentDir(OldDir);
  881.             }
  882.             if (i == 1)
  883.                 ; /* we were started from a project icon, which is
  884.                 currently unsupported */
  885.     }   }
  886.  
  887.     ProcessPtr = (struct Process *) FindTask(NULL);
  888.     strcpy(asldir, "PROGDIR:");
  889.  
  890.     if (pal)
  891.     {   xsize = 640;
  892.         ysize = 256;
  893.     } else
  894.     {   /* RKM Libraries, p. 59-61: */
  895.         if (!(ScreenPtr = LockPubScreen(NULL)))
  896.             rq("Can't lock default public screen!");
  897.         if (GetVPModeID(&(ScreenPtr->ViewPort)) == INVALID_ID)
  898.             rq("Invalid default public screen mode ID!");
  899.         xsize = ScreenPtr->Width;
  900.         ysize = ScreenPtr->Height;
  901.         UnlockPubScreen(NULL, ScreenPtr);
  902.         ScreenPtr = NULL;
  903.     }
  904.  
  905.     /* PREPARE DISPLAY -----------------------------------------------
  906.  
  907.     screen */
  908.  
  909.     if (pal)
  910.     {   if (!(ScreenPtr = (struct Screen *) OpenScreenTags(NULL,
  911.             SA_Width,        xsize,
  912.             SA_Height,       ysize,
  913.             SA_Depth,        4,
  914.             SA_DisplayID,    HIRES_KEY | PAL_MONITOR_ID,
  915.             SA_Title,        TITLEBARTEXT,
  916.             SA_Colors,       Colours,
  917.             SA_Font,         Gadget.ng_TextAttr,
  918.             SA_Pens,         Pens,
  919.             SA_DetailPen,    BLACK,
  920.             SA_BlockPen,     WHITE,
  921.             SA_AutoScroll,   TRUE,
  922.             SA_PubName,      "RPLUS",
  923.             TAG_DONE
  924.         )))
  925.             rq("Can't open custom PAL screen!");
  926.         if (!(BkgrndWindowPtr = (struct Window *) OpenWindowTags(NULL,
  927.             WA_Top,          12,
  928.             WA_Width,        xsize,
  929.             WA_Height,       ysize - 12,
  930.             WA_IDCMP,        NULL,
  931.             WA_Gadgets,      NULL,
  932.             WA_CustomScreen, ScreenPtr,
  933.             WA_Activate,     FALSE,
  934.             WA_Title,        NULL,
  935.             WA_Borderless,   TRUE,
  936.             WA_Backdrop,     TRUE,
  937.             TAG_DONE
  938.         )))
  939.             rq("Can't open backdrop window!");
  940.         SetAPen(BkgrndWindowPtr->RPort, LIGHTGREEN);
  941.         RectFill(BkgrndWindowPtr->RPort, 0, 0, xsize, ysize - 12);
  942.         PubScreenStatus(ScreenPtr, 0); /* take the screen public */
  943.     }
  944.  
  945.     files_init();
  946.     double_init();
  947.  
  948.     if (shared.editor[0] == 0)
  949.         if (GetVar("EDITOR", shared.editor, LONGFIELD, NULL) == -1)
  950.             strcpy(shared.editor, "SYS:Tools/MEmacs");
  951.  
  952.     while(1)
  953.     {   if (page == 11)
  954.             report1();
  955.         elif (page == 12)
  956.             sender();
  957.         elif (page == 13)
  958.             config();
  959.         elif (page == 21)
  960.             aminet1();
  961.         elif (page == 31)
  962.             acse1();
  963.         elif (page == 32)
  964.             acse2();
  965.         elif (page == 33)
  966.             acse3();
  967.         elif (page == 41)
  968.             autodoc1();
  969.         elif (page == 51)
  970.             manuf1();
  971.         elif (page == 61)
  972.             iff1();
  973.         elif (page == 71)
  974.             eol1();
  975.         elif (page == 81)
  976.             size1();
  977.         elif (page == 91)
  978.             batt1();
  979.         elif (page == 101)
  980.             files1();
  981.         elif (page == 111)
  982.             agdb1();
  983.         elif (page == 121)
  984.         {   icon1();
  985.         } else
  986.         {   /* assert(page == 0); */
  987.             menu();
  988. }   }   }
  989.  
  990. MODULE void menu(void)
  991. {   /* PAGE 0 ************************************************************* */
  992.  
  993.     SWORD menuheight;
  994.     ULONG i;
  995.     TEXT  tempstring[5];
  996.  
  997.     certified = FALSE;
  998.     if (pal)
  999.         menuheight = PALMENUHEIGHT;
  1000.     else menuheight = PUBMENUHEIGHT;
  1001.  
  1002.     navigate();
  1003.  
  1004.     /* function labels: 1_2: */
  1005.     tempstring[3] = ':';
  1006.     tempstring[4] = 0;
  1007.     for (i = 1; i <= FUNCTIONS; i++)
  1008.     {   if (i < 10)
  1009.         {   strcpy(tempstring, " _#:");
  1010.             tempstring[2] = '0' + i;
  1011.         } elif (i == 10)
  1012.         {   strcpy(tempstring, "1_0:");
  1013.         } elif (i == 12)
  1014.         {   strcpy(tempstring, "12:");
  1015.         } else
  1016.         {   /* assert(i == 11); */
  1017.             strcpy(tempstring, "11:");
  1018.         }
  1019.         setgadget(38, menuheight - 64 - (FUNCTIONS * 8) + ((i - 1) * 9), 24, 8, tempstring, PLACETEXT_RIGHT);
  1020.         TE00_FunctionText[i - 1] = PrevGadPtr = (struct Gadget *) CreateGadget
  1021.         (   TEXT_KIND,
  1022.         PrevGadPtr,
  1023.             &Gadget,
  1024.             GT_Underscore, '_',
  1025.             TAG_DONE
  1026.         );
  1027.     }
  1028.     /* function */
  1029.     setgadget(100, menuheight - 65 - (FUNCTIONS * 8), 0, 0, NULL, PLACETEXT_RIGHT); /* -8 for each extra function */
  1030.     MX00_Function = PrevGadPtr = (struct Gadget *) CreateGadget
  1031.     (   MX_KIND,
  1032.     PrevGadPtr,
  1033.     &Gadget,
  1034.     GTMX_Labels, &FunctionOptions,
  1035.         GTMX_Active, shared.function,
  1036.     GT_Underscore, '_',
  1037.     TAG_DONE
  1038.     );
  1039.     
  1040.     if (shared.editor[0] == 0)
  1041.         if (GetVar("EDITOR", shared.editor, LONGFIELD, NULL) == -1)
  1042.             strcpy(shared.editor, "SYS:Tools/MEmacs");
  1043.     setgadget(146, menuheight - 42, 180, 12, "_Editor pathname:", NULL);
  1044.     ST00_Editor = PrevGadPtr = (struct Gadget *) CreateGadget
  1045.     (   STRING_KIND,
  1046.     PrevGadPtr,
  1047.     &Gadget,
  1048.         GTST_String, &(shared.editor),
  1049.     GTST_MaxChars, LONGFIELD,
  1050.     GA_TabCycle, TRUE,
  1051.         GT_Underscore, '_',
  1052.         GA_Disabled, FALSE,
  1053.         TAG_DONE
  1054.     );
  1055.     setgadget(328, menuheight - 42, 28, 12, "_...", NULL);
  1056.     BU00_EditorASL = PrevGadPtr = (struct Gadget *) CreateGadget
  1057.     (   BUTTON_KIND,
  1058.     PrevGadPtr,
  1059.     &Gadget,
  1060.         GT_Underscore, '_',
  1061.         GA_Disabled, FALSE,
  1062.         TAG_DONE
  1063.     );
  1064.  
  1065.     newwindow
  1066.     (   366, menuheight,
  1067.         "Report+: Main Menu",
  1068.         BUTTONIDCMP | MXIDCMP | STRINGIDCMP
  1069.     );
  1070.     if (pal)
  1071.         DrawImage(MainWindowPtr->RPort, &PalLogo, 81, 20);
  1072.     else DrawImage(MainWindowPtr->RPort, &PubLogo, 81, 20);
  1073.  
  1074.     if (react)
  1075.     {   GT_SetGadgetAttrs(ST00_Editor,    MainWindowPtr, NULL, GA_Disabled, TRUE, TAG_DONE);
  1076.         GT_SetGadgetAttrs(BU00_EditorASL, MainWindowPtr, NULL, GA_Disabled, TRUE, TAG_DONE);
  1077.     }
  1078.     loop();
  1079.     strcpy
  1080.     (   shared.editor,
  1081.         ((struct StringInfo *) ST00_Editor->SpecialInfo)->Buffer
  1082.     );
  1083.     closewindow();
  1084. }
  1085.  
  1086. MODULE void double_exit(void)
  1087. {   if (EADataPtr)
  1088.     {   FreeVec(EADataPtr);
  1089.         EADataPtr = NULL;
  1090. }   }
  1091.  
  1092. AGLOBAL void cleanexit(SBYTE rc)
  1093. {   /* ASL requesters are assumed to be already closed.
  1094.  
  1095.     iffparse.library is never opened or closed. :-O */
  1096.  
  1097.     /* help|about... */
  1098.     if (AboutWindowPtr)
  1099.     {   if (pal)
  1100.             unboingball();
  1101.         CloseWindow(AboutWindowPtr);
  1102.         AboutWindowPtr = NULL;
  1103.     }
  1104.  
  1105.     /* Reaction (functions 1, 2, 4, 10-12) */
  1106.     if (wbval >= 44)
  1107.     {   CloseLibrary(ButtonBase);
  1108.         CloseLibrary(CheckBoxBase);
  1109.         CloseLibrary(ChooserBase);
  1110.         CloseLibrary(LabelBase);
  1111.         CloseLibrary(LayoutBase);
  1112.         CloseLibrary(ListBrowserBase);
  1113.         CloseLibrary(StringBase);
  1114.         CloseLibrary(TextEditorBase);
  1115.         CloseLibrary(WindowBase);
  1116.  
  1117.         CloseLibrary((struct Library *) IconBase);
  1118.     }
  1119.  
  1120.     /* function 10 */
  1121.     if (ListBrowserBase)
  1122.     {   clearlblist();
  1123.         CloseLibrary(ListBrowserBase);
  1124.         ListBrowserBase = NULL;
  1125.     }
  1126.  
  1127.     /* all */
  1128.     unlockscreen();
  1129.     if (OldWindowPtr)
  1130.     {   ProcessPtr->pr_WindowPtr = OldWindowPtr;
  1131.         OldWindowPtr = NULL;
  1132.     }
  1133.     if (MainWindowPtr)
  1134.     {   closewindow(); /* this sets appropriate pointers to NULL */
  1135.     }
  1136.  
  1137.     /* Remember that you can't fool around with the list whilst the
  1138.     gadget is still using it. So we close the window before calling
  1139.     these next routines. */
  1140.  
  1141.     report_exit();
  1142.     size_exit();
  1143.     aminet_exit();
  1144.  
  1145.     /* all */
  1146.     if (pal)
  1147.     {   if (BkgrndWindowPtr)
  1148.         {   CloseWindow(BkgrndWindowPtr);
  1149.             BkgrndWindowPtr = NULL;
  1150.         }
  1151.         if (ScreenPtr)
  1152.         {   if (!CloseScreen(ScreenPtr))
  1153.             {   DisplayBeep(ScreenPtr);
  1154.             }
  1155.             /* Can't close screen, due to visitor windows. Yet we MUST */
  1156.             /* exit the program, of course - either the user has demanded */
  1157.             /* it, or the program has hit an error. So we leave the */
  1158.             /* screen open and shut down everything else, including the */
  1159.             /* program. */
  1160.             ScreenPtr = NULL;
  1161.     }   }
  1162.  
  1163.     acse_exit();
  1164.     files_exit();
  1165.     double_exit();
  1166.  
  1167.     if (FontPtr)
  1168.     {   CloseFont(FontPtr);
  1169.         FontPtr = NULL;
  1170.     }
  1171.     if (BoardsBase)
  1172.     {   CloseLibrary(BoardsBase);
  1173.     }
  1174.     if (DiskFontBase)
  1175.         CloseLibrary((struct Library *) DiskFontBase);
  1176.     if (ASLBase)
  1177.         CloseLibrary((struct Library *) ASLBase);
  1178.     if (GadToolsBase)
  1179.         CloseLibrary((struct Library *) GadToolsBase);
  1180.     if (ArgsPtr)
  1181.         FreeArgs(ArgsPtr);
  1182.     if (IntuitionBase)
  1183.     {   OpenWorkBench();
  1184.         CloseLibrary((struct Library *) IntuitionBase);
  1185.     }
  1186.     exit(rc); /* End of program. */
  1187. }
  1188.  
  1189. MODULE void clearkybd(void)
  1190. {   struct IntuiMessage* MsgPtr;
  1191.  
  1192.     while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  1193.         GT_ReplyIMsg(MsgPtr);
  1194. }
  1195.  
  1196. AGLOBAL void FreeNameNodes(struct List* ListPtr)
  1197. {   /* RKM Libraries, p. 496:
  1198.     
  1199.     "Free the entire list, including the header. The header is not
  1200.     updated as the list is freed. This function demonstrates how to
  1201.     avoid referencing freed memory when deallocating nodes." */
  1202.  
  1203.     struct NameNode *WorkNodePtr, *NextNodePtr;
  1204.     
  1205.     WorkNodePtr = (struct NameNode *) (ListPtr->lh_Head); /* first node */
  1206.     while (NextNodePtr = (struct NameNode *) (WorkNodePtr->nn_Node.ln_Succ))
  1207.     {   FreeMem(WorkNodePtr, sizeof(struct NameNode));
  1208.         WorkNodePtr = NextNodePtr;
  1209. }   }
  1210.  
  1211. AGLOBAL void gadtools(void)
  1212. {   if (!pal)
  1213.     {   if (!(ScreenPtr = LockPubScreen(NULL)))
  1214.             rq("Can't lock default public screen!");
  1215.     }
  1216.     if (!(Gadget.ng_VisualInfo = VisualInfoPtr = (struct VisualInfo *) GetVisualInfo(ScreenPtr, TAG_DONE)))
  1217.         rq("Can't get GadTools visual info!");
  1218.     if (!pal)
  1219.     {   UnlockPubScreen(NULL, ScreenPtr);
  1220.         ScreenPtr = NULL;
  1221.     }
  1222.     if (pal)
  1223.     {   if (!(MenuPtr = (struct Menu *) CreateMenus(NewMenu, GTMN_FrontPen, BLACK, TAG_DONE)))
  1224.             rq("Can't create menus!");
  1225.     } else
  1226.     {   if (!(MenuPtr = (struct Menu *) CreateMenus(NewMenu, TAG_DONE)))
  1227.             rq("Can't create menus!");
  1228.     }
  1229.     if (!(LayoutMenus(MenuPtr, VisualInfoPtr, GTMN_NewLookMenus, TRUE, TAG_DONE)))
  1230.         rq("Can't lay out menus!");
  1231.     GListPtr = NULL; /* that needs doing for the CreateContext() call */
  1232.     if (!(PrevGadPtr = (struct Gadget *) CreateContext(&GListPtr)))
  1233.         rq("Can't create GadTools context!");
  1234. }
  1235.  
  1236. AGLOBAL void verynewwindow(SWORD width, SWORD height, STRPTR title, ULONG idcmp)
  1237. {   gadtools();
  1238.  
  1239.     if (pal)
  1240.     {   if (!(MainWindowPtr = (struct Window *) OpenWindowTags(NULL,
  1241.             WA_Left,         (xsize / 2) - (width / 2),          
  1242.             WA_Top,          12 + ((ysize - 12) / 2) - (height / 2),
  1243.             WA_Width,        width,
  1244.             WA_Height,       height,
  1245.             WA_IDCMP,        IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_REFRESHWINDOW
  1246.                              | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS | IDCMP_VANILLAKEY
  1247.                              | IDCMP_RAWKEY | idcmp,
  1248.             WA_Gadgets,      NULL,
  1249.             WA_CustomScreen, ScreenPtr,
  1250.             WA_Activate,     TRUE,
  1251.             WA_Title,        title,
  1252.             WA_DragBar,      TRUE,
  1253.             WA_DepthGadget,  TRUE,
  1254.             WA_CloseGadget,  TRUE,
  1255.             WA_SmartRefresh, TRUE,
  1256.             TAG_DONE)))
  1257.             rq("Can't open main window!");
  1258.  
  1259.         /* redirection of AmigaDOS system requesters */
  1260.         OldWindowPtr = ProcessPtr->pr_WindowPtr;
  1261.         ProcessPtr->pr_WindowPtr = (APTR) MainWindowPtr;
  1262.     } else
  1263.     {   if (!(ScreenPtr = LockPubScreen(NULL)))
  1264.             rq("Can't lock default public screen!");
  1265.         /* open the window on the public screen */
  1266.         if (!(MainWindowPtr = (struct Window*) OpenWindowTags(NULL,
  1267.                 WA_Left,         (xsize / 2) - (width / 2),
  1268.                 WA_Top,          12 + ((ysize - 12) / 2) - (height / 2),
  1269.                 WA_Width,        width,
  1270.                 WA_Height,       height,
  1271.                 WA_IDCMP,
  1272.                 IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_REFRESHWINDOW
  1273.                 | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS | IDCMP_VANILLAKEY
  1274.                 | IDCMP_RAWKEY | idcmp,
  1275.                 WA_Gadgets,      NULL,
  1276.                 WA_PubScreen,    ScreenPtr,
  1277.                 WA_Activate,     TRUE,
  1278.                 WA_Title,        title,
  1279.                 WA_DragBar,      TRUE,
  1280.                 WA_DepthGadget,  TRUE,
  1281.                 WA_CloseGadget,  TRUE,
  1282.                 WA_SmartRefresh, TRUE,
  1283.                 WA_NewLookMenus, TRUE,
  1284.                 TAG_DONE)))
  1285.             rq("Can't open main window!");
  1286.         UnlockPubScreen(NULL, ScreenPtr);
  1287.         ScreenPtr = NULL;
  1288.     }
  1289.     SetMenuStrip(MainWindowPtr, MenuPtr);
  1290.     SetFont(MainWindowPtr->RPort, FontPtr);
  1291.  
  1292.     if (fillwindows)
  1293.     {   getfillcolour();
  1294.         SetAPen
  1295.         (   MainWindowPtr->RPort,
  1296.             fillcolour
  1297.         );
  1298.         RectFill
  1299.         (   MainWindowPtr->RPort,
  1300.             MainWindowPtr->BorderLeft,
  1301.             MainWindowPtr->BorderTop,
  1302.              width - 1 - MainWindowPtr->BorderRight,
  1303.             height - 1 - MainWindowPtr->BorderBottom
  1304.         );
  1305.     }
  1306.  
  1307.     navigate();
  1308. }
  1309.  
  1310. AGLOBAL void newwindow(SWORD width, SWORD height, STRPTR title, ULONG idcmp)
  1311. {   if (pal)
  1312.     {   if (!(MainWindowPtr = (struct Window *) OpenWindowTags
  1313.         (   NULL,
  1314.             WA_Left,         (xsize / 2) - (width / 2),
  1315.             WA_Top,          12 + ((ysize - 12) / 2) - (height / 2),
  1316.             WA_Width,        width,
  1317.             WA_Height,       height,
  1318.             WA_IDCMP,        IDCMP_CLOSEWINDOW | IDCMP_MENUPICK |
  1319.                              IDCMP_REFRESHWINDOW | IDCMP_MOUSEBUTTONS |
  1320.                              IDCMP_INTUITICKS | IDCMP_VANILLAKEY |
  1321.                              IDCMP_RAWKEY | idcmp,
  1322.             WA_Gadgets,      GListPtr,
  1323.             WA_CustomScreen, ScreenPtr,
  1324.             WA_Activate,     TRUE,
  1325.             WA_Title,        title,
  1326.             WA_DragBar,      TRUE,
  1327.             WA_DepthGadget,  TRUE,
  1328.             WA_CloseGadget,  TRUE,
  1329.             WA_SmartRefresh, TRUE,
  1330.             TAG_DONE
  1331.         )))
  1332.         {   rq("Can't open main window!");
  1333.         }
  1334.  
  1335.         /* redirection of AmigaDOS system requesters */
  1336.         OldWindowPtr = ProcessPtr->pr_WindowPtr;
  1337.         ProcessPtr->pr_WindowPtr = (APTR) MainWindowPtr;
  1338.     } else
  1339.     {   lockscreen();
  1340.         /* open the window on the public screen */
  1341.         if (!(MainWindowPtr = (struct Window*) OpenWindowTags
  1342.         (   NULL,
  1343.             WA_Left,         (xsize / 2) - (width / 2),
  1344.             WA_Top,          12 + ((ysize - 12) / 2) - (height / 2),
  1345.             WA_Width,        width,
  1346.             WA_Height,       height,
  1347.             WA_IDCMP,        IDCMP_CLOSEWINDOW | IDCMP_MENUPICK |
  1348.                              IDCMP_REFRESHWINDOW | IDCMP_MOUSEBUTTONS |
  1349.                              IDCMP_INTUITICKS | IDCMP_VANILLAKEY |
  1350.                              IDCMP_RAWKEY | idcmp,
  1351.             WA_Gadgets,      GListPtr,
  1352.             WA_PubScreen,    ScreenPtr,
  1353.             WA_Activate,     TRUE,
  1354.             WA_Title,        title,
  1355.             WA_DragBar,      TRUE,
  1356.             WA_DepthGadget,  TRUE,
  1357.             WA_CloseGadget,  TRUE,
  1358.             WA_SmartRefresh, TRUE,
  1359.             WA_NewLookMenus, TRUE,
  1360.             TAG_DONE
  1361.          )))
  1362.             rq("Can't open main window!");
  1363.         unlockscreen();
  1364.     }
  1365.     SetMenuStrip(MainWindowPtr, MenuPtr);
  1366.     GT_RefreshWindow(MainWindowPtr, NULL);
  1367. }
  1368.  
  1369. MODULE void helpabout(void)
  1370. {   SBYTE line;
  1371.     TEXT  ks[5], wb[5];
  1372.  
  1373.     OffMenu(MainWindowPtr, FULLMENUNUM(MN_HELP, IN_ABOUT, NOSUB));
  1374.     switch(ksval)
  1375.     {
  1376.     case 38:
  1377.         strcpy(ks, "2.1 ");
  1378.     break;
  1379.     case 39:
  1380.         strcpy(ks, "3.0 ");
  1381.     break;
  1382.     case 40:
  1383.         strcpy(ks, "3.1 ");
  1384.     break;
  1385.     default:
  1386.         strcpy(ks, "4.0+");
  1387.     break;
  1388.     }
  1389.     switch(wbval)
  1390.     {
  1391.     break;
  1392.     case 38:
  1393.         strcpy(wb, "2.1 ");
  1394.     break;
  1395.     case 39:
  1396.         strcpy(wb, "3.0 ");
  1397.     break;
  1398.     case 40:
  1399.     case 41:
  1400.     case 42:
  1401.     case 43:
  1402.         strcpy(wb, "3.1 ");
  1403.     break;
  1404.     case 44:
  1405.         strcpy(wb, "3.5 ");
  1406.     break;
  1407.     case 45:
  1408.         strcpy(wb, "3.9 ");
  1409.     break;
  1410.     default:
  1411.         strcpy(wb, "4.0+");
  1412.     break;
  1413.     }
  1414.  
  1415.     if (pal)
  1416.     {   if (!(AboutWindowPtr = (struct Window *) OpenWindowTags(NULL,
  1417.         WA_Left,          (xsize / 2) - (ABOUTXPIXEL / 2),
  1418.         WA_Top,           12 + ((ysize - 12) / 2) - (ABOUTYPALPIXEL / 2),
  1419.         WA_Width,         ABOUTXPIXEL,
  1420.         WA_Height,        ABOUTYPALPIXEL,
  1421.         WA_IDCMP,         IDCMP_CLOSEWINDOW | IDCMP_RAWKEY,
  1422.         WA_Title,         "About Report+",
  1423.         WA_Gadgets,       NULL,
  1424.         WA_CustomScreen,  ScreenPtr,
  1425.         WA_DragBar,       TRUE,
  1426.         WA_DepthGadget,   TRUE,
  1427.         WA_CloseGadget,   TRUE,
  1428.         WA_NoCareRefresh, TRUE,
  1429.         WA_Activate,      TRUE,
  1430.     TAG_DONE)))
  1431.             rq("Can't open About... window!");
  1432.  
  1433.         SetAPen(AboutWindowPtr->RPort, LIGHTGREY);
  1434.         RectFill(AboutWindowPtr->RPort, 8, 13, ABOUTXPIXEL - 9, ABOUTYPALPIXEL - 5);
  1435.     SetAPen(AboutWindowPtr->RPort, ABOUTSHADOW);
  1436.         Move(AboutWindowPtr->RPort, 7, ABOUTYPALPIXEL - 4);
  1437.     Draw(AboutWindowPtr->RPort, 7, 12);
  1438.     Draw(AboutWindowPtr->RPort, ABOUTXPIXEL - 8, 12);
  1439.     SetAPen(AboutWindowPtr->RPort, ABOUTSHINE);
  1440.         Draw(AboutWindowPtr->RPort, ABOUTXPIXEL - 8, ABOUTYPALPIXEL - 4);
  1441.         Draw(AboutWindowPtr->RPort, 8, ABOUTYPALPIXEL - 4);
  1442.     } else
  1443.     {   lockscreen();
  1444.         if (!(AboutWindowPtr = (struct Window *) OpenWindowTags
  1445.         (   NULL,
  1446.             WA_Left,          (xsize / 2) - (ABOUTXPIXEL / 2),
  1447.             WA_Top,           12 + ((ysize - 12) / 2) - (ABOUTYPUBPIXEL / 2),
  1448.             WA_Width,         ABOUTXPIXEL,
  1449.             WA_Height,        ABOUTYPUBPIXEL,
  1450.             WA_IDCMP,         IDCMP_CLOSEWINDOW | IDCMP_RAWKEY,
  1451.             WA_Title,         "About Report+",
  1452.             WA_Gadgets,       NULL,
  1453.             WA_PubScreen,     ScreenPtr,
  1454.             WA_DragBar,       TRUE,
  1455.             WA_DepthGadget,   TRUE,
  1456.             WA_CloseGadget,   TRUE,
  1457.             WA_NoCareRefresh, TRUE,
  1458.             WA_Activate,      TRUE,
  1459.             TAG_DONE
  1460.         )))
  1461.         {   rq("Can't open About... window!");
  1462.         }
  1463.         unlockscreen();
  1464.     }
  1465.  
  1466.     SetFont(AboutWindowPtr->RPort, FontPtr);
  1467.     SetDrMd(AboutWindowPtr->RPort, JAM1);
  1468.     SetAPen(AboutWindowPtr->RPort, BLACK);
  1469.     for (line = 0; line <= ABOUTLINES; line++)
  1470.     {   if (pal || line < ABOUTLINES)
  1471.         {   Move(AboutWindowPtr->RPort, about[line].x, about[line].y);
  1472.             Text(AboutWindowPtr->RPort, about[line].text, (SBYTE) strlen(about[line].text));
  1473.             if (line == 4)
  1474.             {   Text(AboutWindowPtr->RPort, ks, 4);
  1475.             } elif (line == 5)
  1476.             {   Text(AboutWindowPtr->RPort, wb, 4);
  1477.     }   }   }
  1478.  
  1479.     if (pal)
  1480.     {   DrawBevelBox(AboutWindowPtr->RPort, 19, 21, 45, 23, GT_VisualInfo, VisualInfoPtr, GTBB_Recessed, TRUE, TAG_DONE);
  1481.         DrawImage(AboutWindowPtr->RPort, &PalAbout, 20, 22);
  1482.     } else
  1483.     {   DrawBevelBox(AboutWindowPtr->RPort, 19, 21, 45, 46, GT_VisualInfo, VisualInfoPtr, GTBB_Recessed, TRUE, TAG_DONE);
  1484.         DrawImage(AboutWindowPtr->RPort, &PubAbout, 20, 22);
  1485.     }
  1486.  
  1487.     if (pal)
  1488.         boingball();
  1489. }
  1490.  
  1491. AGLOBAL void closewindow(void)
  1492. {   if (MainWindowPtr)
  1493.     {   clearkybd();
  1494.         ClearMenuStrip(MainWindowPtr);
  1495.         CloseWindow(MainWindowPtr);
  1496.         MainWindowPtr = NULL;
  1497.     }
  1498.     if (GListPtr)
  1499.     {   FreeGadgets(GListPtr);
  1500.         GListPtr = NULL;
  1501.     }
  1502.     if (MenuPtr)
  1503.     {   FreeMenus(MenuPtr);
  1504.         MenuPtr = NULL;
  1505.     }
  1506.     if (VisualInfoPtr)
  1507.     {   FreeVisualInfo(VisualInfoPtr);
  1508.         VisualInfoPtr = NULL;
  1509. }   }
  1510.  
  1511. AGLOBAL ABOOL asl(void)
  1512. {   struct FileRequester* ASLRqPtr;
  1513.     ABOOL                 success;
  1514.  
  1515.     if (!(ASLRqPtr = AllocAslRequestTags(ASL_FileRequest, ASL_Pattern, "~(#?.info)", ASL_Window, MainWindowPtr, TAG_DONE)))
  1516.         rq("Can't create ASL request!");
  1517.     if
  1518.     (   AslRequestTags(ASLRqPtr, ASL_Dir, asldir, ASL_Hail, "Report+ file selector", ASL_FuncFlags, FILF_PATGAD, TAG_DONE)
  1519.      && *(ASLRqPtr->rf_File) != 0
  1520.     )
  1521.     {   strcpy(asldir, ASLRqPtr->rf_Dir);
  1522.         strcpy(aslresult, ASLRqPtr->rf_Dir);
  1523.         if (!AddPart(aslresult, ASLRqPtr->rf_File, VLONGFIELD))
  1524.             rq("Can't add filename to pathname!");
  1525.         success = TRUE;
  1526.     } else
  1527.     {   strcpy(asldir, "");
  1528.         strcpy(aslresult, "");
  1529.         success = FALSE;
  1530.     }
  1531.     FreeAslRequest(ASLRqPtr);
  1532.     return(success);
  1533. }
  1534.  
  1535. AGLOBAL void reaction_loop(void)
  1536. {   SWORD oldpage = page;
  1537.     ULONG signals, result;
  1538.     UWORD code;
  1539.  
  1540.     done = FALSE;
  1541.     while (page == oldpage && (!done))
  1542.     {   if (AboutWindowPtr)
  1543.         {   if (pal)
  1544.             {   DrawGels();
  1545.             }
  1546.             signals = SetSignal(0L, 0L);
  1547.             if (signals & SIGBREAKF_CTRL_C)
  1548.             {   done = TRUE;
  1549.                 SetSignal(0L, SIGBREAKF_CTRL_C); /* clear the Ctrl-C signal */
  1550.             }
  1551.             if (aboutloop())
  1552.             {   if (pal)
  1553.                 {   unboingball();
  1554.                 }
  1555.                 CloseWindow(AboutWindowPtr);
  1556.                 AboutWindowPtr = NULL;
  1557.                 OnMenu(MainWindowPtr, FULLMENUNUM(MN_HELP, IN_ABOUT, NOSUB));
  1558.         }   }
  1559.         else
  1560.         {   if ((Wait(signal | SIGBREAKF_CTRL_C | app)) & SIGBREAKF_CTRL_C)
  1561.             {  done = TRUE;
  1562.                /* should we clear the Ctrl-C signal? */
  1563.         }   }
  1564.         while ((result = DoMethod((Object *) object, WM_HANDLEINPUT, &code)) != WMHI_LASTMSG)
  1565.         {   switch (result & WMHI_CLASSMASK)
  1566.             {
  1567.             case WMHI_MENUPICK:
  1568.                 handlemenus(code);
  1569.             break;
  1570.             case WMHI_CLOSEWINDOW:
  1571.                 done = quit = TRUE;
  1572.             break;
  1573.             case WMHI_GADGETUP:
  1574.                 icon_loop(result & WMHI_GADGETMASK);
  1575.             break;
  1576.             default:
  1577.             break;
  1578. }   }   }   }
  1579.  
  1580. AGLOBAL void loop(void)
  1581. {   AUTO SWORD                oldpage = page;
  1582.     AUTO struct Gadget*       addr;
  1583.     AUTO struct IntuiMessage* MsgPtr;
  1584.     AUTO UWORD                code, qual;
  1585.     AUTO ULONG                class;
  1586.     AUTO SWORD                mousex, mousey;
  1587.  
  1588.     /* i must be signed, and at least 16 bits wide. */
  1589.  
  1590.     done = FALSE;
  1591.     while (page == oldpage && (!done))
  1592.     {   if (AboutWindowPtr)
  1593.         {   if (pal)
  1594.             {   DrawGels();
  1595.             }
  1596.             if (aboutloop())
  1597.             {   if (pal)
  1598.                     unboingball();
  1599.                 CloseWindow(AboutWindowPtr);
  1600.                 AboutWindowPtr = NULL;
  1601.                 OnMenu(MainWindowPtr, FULLMENUNUM(MN_HELP, IN_ABOUT, NOSUB));
  1602.         }   }
  1603.         else
  1604.         {   Wait(1L <<  MainWindowPtr->UserPort->mp_SigBit);
  1605.         }
  1606.         while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  1607.         {   class  = MsgPtr->Class;                       
  1608.             code   = MsgPtr->Code;
  1609.             addr   = MsgPtr->IAddress;
  1610.             qual   = MsgPtr->Qualifier;
  1611.             mousex = MsgPtr->MouseX;
  1612.             mousey = MsgPtr->MouseY;
  1613.             GT_ReplyIMsg(MsgPtr);
  1614.             switch(class)
  1615.             {
  1616.             case IDCMP_MENUPICK:
  1617.                 handlemenus(code);
  1618.             break;
  1619.             case IDCMP_CLOSEWINDOW:
  1620.                 cleanexit(EXIT_SUCCESS);
  1621.             break;
  1622.             case IDCMP_REFRESHWINDOW:
  1623.                 GT_BeginRefresh(MainWindowPtr);
  1624.                 GT_EndRefresh(MainWindowPtr, TRUE);
  1625.             break;
  1626.             default:
  1627.                 if (class == IDCMP_RAWKEY && code == SCAN_HELP)
  1628.                 {   helpabout();
  1629.                 } elif (page == 0)
  1630.                 {   if (class == IDCMP_GADGETDOWN)
  1631.                     {   /* radio gadgets */
  1632.                         if (addr == MX00_Function)
  1633.                         {   shared.function = code;
  1634.                             if ((wbval < 44 || pal) && code == 11)
  1635.                             {   GT_SetGadgetAttrs
  1636.                                 (   BU99_Right,
  1637.                                     MainWindowPtr,
  1638.                                     NULL,
  1639.                                     GA_Disabled, TRUE,
  1640.                                     TAG_DONE
  1641.                                 );
  1642.                             } else
  1643.                             {   GT_SetGadgetAttrs
  1644.                                 (   BU99_Right,
  1645.                                     MainWindowPtr,
  1646.                                     NULL,
  1647.                                     GA_Disabled, FALSE,
  1648.                                     TAG_DONE
  1649.                                 );
  1650.                     }   }   }
  1651.                     elif (class == IDCMP_GADGETUP)
  1652.                     {   /* buttons, listviews, checkboxes */
  1653.                         if (addr == BU99_Right)
  1654.                         {   page = 11 + (shared.function * 10);
  1655.                         } elif (BU00_EditorASL)
  1656.                         {   asl();
  1657.                             GT_SetGadgetAttrs
  1658.                             (   ST00_Editor,
  1659.                                 MainWindowPtr,
  1660.                                 NULL,
  1661.                                 GTST_String, aslresult,
  1662.                                 TAG_DONE
  1663.                             );
  1664.                     }   }
  1665.                     elif (class == IDCMP_RAWKEY)
  1666.                     {   if (code == SCAN_UP && shared.function > 0)
  1667.                         {   if (qual & IEQUALIFIER_CONTROL)
  1668.                                 shared.function = 0;
  1669.                             else shared.function--;
  1670.                             GT_SetGadgetAttrs
  1671.                             (   MX00_Function,
  1672.                                 MainWindowPtr,
  1673.                                 NULL,
  1674.                                 GTMX_Active, shared.function,
  1675.                                 TAG_DONE
  1676.                             );
  1677.                             if (shared.function == 11 && wbval < 44)
  1678.                             {   GT_SetGadgetAttrs
  1679.                                 (   BU99_Right,
  1680.                                     MainWindowPtr,
  1681.                                     NULL,
  1682.                                     GA_Disabled, TRUE,
  1683.                                     TAG_DONE
  1684.                                 );
  1685.                             } else
  1686.                             {   GT_SetGadgetAttrs
  1687.                                 (   BU99_Right,
  1688.                                     MainWindowPtr,
  1689.                                     NULL,
  1690.                                     GA_Disabled, FALSE,
  1691.                                     TAG_DONE
  1692.                                 );
  1693.                         }   }
  1694.                         elif (code == SCAN_DOWN && shared.function < FUNCTIONS - 1)
  1695.                         {   if (qual & IEQUALIFIER_CONTROL)
  1696.                             {   shared.function = FUNCTIONS - 1;
  1697.                             } else shared.function++;
  1698.                             GT_SetGadgetAttrs
  1699.                             (   MX00_Function,
  1700.                                 MainWindowPtr,
  1701.                                 NULL,
  1702.                                 GTMX_Active, shared.function,
  1703.                                 TAG_DONE
  1704.                             );
  1705.                             if (shared.function == 11 && (wbval < 44 || pal))
  1706.                             {   GT_SetGadgetAttrs
  1707.                                 (   BU99_Right,
  1708.                                     MainWindowPtr,
  1709.                                     NULL,
  1710.                                     GA_Disabled, TRUE,
  1711.                                     TAG_DONE
  1712.                                 );
  1713.                             } else
  1714.                             {   GT_SetGadgetAttrs
  1715.                                 (   BU99_Right,
  1716.                                     MainWindowPtr,
  1717.                                     NULL,
  1718.                                     GA_Disabled, FALSE,
  1719.                                     TAG_DONE
  1720.                                 );
  1721.                     }   }   }
  1722.                     elif (class == IDCMP_VANILLAKEY)
  1723.                     {   code = toupper(code);
  1724.                         if (code == '`' && ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT)))
  1725.                         {   decrypt();
  1726.                         } elif (code == ESCAPE)
  1727.                         {   cleanexit(EXIT_SUCCESS);
  1728.                         } elif (code >= '0' && code <= '9')
  1729.                         {   if (code == '0')
  1730.                                 shared.function = 9;
  1731.                             else shared.function = code - '1';
  1732.                             GT_SetGadgetAttrs
  1733.                             (   MX00_Function,
  1734.                                 MainWindowPtr,
  1735.                                 NULL,
  1736.                                 GTMX_Active, shared.function,
  1737.                                 TAG_DONE
  1738.                             );
  1739.                         } elif (code == 'A')
  1740.                         {   shared.function = 10;
  1741.                             GT_SetGadgetAttrs
  1742.                             (   MX00_Function,
  1743.                                 MainWindowPtr,
  1744.                                 NULL,
  1745.                                 GTMX_Active, shared.function,
  1746.                                 TAG_DONE
  1747.                             );
  1748.                         } elif (code == 'I' && wbval >= 44)
  1749.                         {   shared.function = 11;
  1750.                             GT_SetGadgetAttrs
  1751.                             (   MX00_Function,
  1752.                                 MainWindowPtr,
  1753.                                 NULL,
  1754.                                 GTMX_Active, shared.function,
  1755.                                 TAG_DONE
  1756.                             );
  1757.                         } elif (code == '.')
  1758.                         {   asl();
  1759.                             GT_SetGadgetAttrs
  1760.                             (   ST00_Editor,
  1761.                                 MainWindowPtr,
  1762.                                 NULL,
  1763.                                 GTST_String, aslresult,
  1764.                                 TAG_DONE
  1765.                             );
  1766.                         } elif (code == 'E')
  1767.                         {   ActivateGadget(ST00_Editor, MainWindowPtr, NULL);
  1768.                         } elif (code == 'B' || code == CR)
  1769.                         {   if (wbval >= 44 || shared.function != 11)
  1770.                             {   page = (shared.function * 10) + 11;
  1771.                 }   }   }   }
  1772.                 elif (page >= 11 && page <= 14)
  1773.                     report_loop(class, addr, code, qual);
  1774.                 elif (page >= 21 && page <= 22)
  1775.                     aminet_loop(class, addr, code);
  1776.                 elif (page >= 31 && page <= 33)
  1777.                     acse_loop(class, addr, code);
  1778.                 elif (page >= 41 && page <= 42)
  1779.                     autodoc_loop(class, addr, code);
  1780.                 elif (page == 51)
  1781.                     manuf_loop(class, addr, code);
  1782.                 elif (page == 61)
  1783.                     iff_loop(class, addr, code, qual);
  1784.                 elif (page == 71)
  1785.                     eol_loop(class, addr, code, qual);
  1786.                 elif (page == 81)
  1787.                     size_loop(class, addr, code, qual);
  1788.                 elif (page == 91)
  1789.                     batt_loop(class, addr, code, qual, mousex, mousey);
  1790.                 elif (page == 101)
  1791.                     files_loop(class, addr, code, qual);
  1792.                 elif (page == 111)
  1793.                 {   agdb_loop(class, addr, code);
  1794.                 }
  1795.             break;
  1796. }   }   }   }
  1797.  
  1798. AGLOBAL void navigate(void)
  1799. {   gadtools();
  1800.  
  1801.     /* BU99_Right is created first, as all windows use it. Therefore all
  1802.     windows can safely call AddGList(), etc. with the BU99_Right argument. */
  1803.  
  1804.     /* next */
  1805.     switch(page)
  1806.     {
  1807.     case 0:
  1808.         if (pal)
  1809.             setgadget(        10, PALMENUHEIGHT - 16,                   346, 12, "_Begin",   NULL);
  1810.         else setgadget(       10, PUBMENUHEIGHT - 16,                   346, 12, "_Begin",   NULL);
  1811.     break;
  1812.     case 11:
  1813.         setgadget(            10,  REPORTHEIGHT - 16,      REPORTWIDTH - 20, 12, "Menu",     NULL);
  1814.     break;
  1815.     case 12:
  1816.         setgadget(            10,  SENDERHEIGHT - 16,      SENDERWIDTH - 20, 12, "OK",     NULL);
  1817.     break;
  1818.     case 13:
  1819.         setgadget(            10,  CONFIGHEIGHT - 16,      CONFIGWIDTH - 20, 12, "OK",     NULL);
  1820.     break;
  1821.     case 21:                                                                                
  1822.         setgadget(            10,  AMINETHEIGHT - 16,      AMINETWIDTH - 20, 12, "Menu",     NULL);
  1823.     break;
  1824.     case 31:
  1825.         setgadget(            10,   ACSE1HEIGHT - 16,       ACSE1WIDTH - 20, 12, "Menu",     NULL);
  1826.     break;
  1827.     case 32:
  1828.         if (certified)
  1829.             setgadget(        10,   ACSE2HEIGHT - 16,       ACSE2WIDTH - 20, 12, "OK",       NULL);
  1830.         else                                                                                 
  1831.             setgadget(        10,   ACSE2HEIGHT - 16,       ACSE2WIDTH - 20, 12, "Menu",     NULL);
  1832.     break;
  1833.     case 33:
  1834.         setgadget(            10,   ACSE3HEIGHT - 16,       ACSE3WIDTH - 20, 12, "Menu",     NULL);
  1835.     break;
  1836.     case 41:
  1837.         setgadget(            10, AUTODOCHEIGHT - 16,     AUTODOCWIDTH - 20, 12, "Menu",     NULL);
  1838.     break;
  1839.     case 51:
  1840.         setgadget(            10,  MANUF1HEIGHT - 16,      MANUF1WIDTH - 20, 12, "Menu",     NULL);
  1841.     break;
  1842.     case 61:
  1843.         setgadget(            10,    IFF1HEIGHT - 16,        IFF1WIDTH - 20, 12, "Menu",     NULL);
  1844.     break;
  1845.     case 71:
  1846.         setgadget(            10,    EOL1HEIGHT - 16,        EOL1WIDTH - 20, 12, "Menu",     NULL);
  1847.     break;
  1848.     case 81:
  1849.         if (ysize >= 512)
  1850.         {   setgadget(        10,           512 - 16,       SIZE1WIDTH - 20, 12, "Menu",     NULL);
  1851.         } else
  1852.         {   setgadget(        10,   SIZE1HEIGHT - 16,       SIZE1WIDTH - 20, 12, "Menu",     NULL);
  1853.         }
  1854.     break;
  1855.     case 91:
  1856.         setgadget(            10,   BATT1HEIGHT - 16,       BATT1WIDTH - 20, 12, "Menu",     NULL);
  1857.     break;
  1858.     case 101:
  1859.         setgadget(            10,  FILES1HEIGHT - 16,      FILES1WIDTH - 20, 12, "Menu",     NULL);
  1860.     break;
  1861.     case 111:
  1862.         setgadget(            10,    AGDBHEIGHT - 16,        AGDBWIDTH - 20, 12, "Menu",     NULL);
  1863.     break;
  1864.     default:
  1865.     break;
  1866.     }
  1867.     BU99_Right = PrevGadPtr = (struct Gadget *) CreateGadget
  1868.     (   BUTTON_KIND,
  1869.         PrevGadPtr,
  1870.         &Gadget,
  1871.         GT_Underscore, '_',
  1872.         TAG_DONE
  1873.     );
  1874. }
  1875.  
  1876. AGLOBAL void setgadget(WORD leftx, WORD topy, WORD width, WORD height,
  1877. STRPTR text, ULONG flags)
  1878. {   Gadget.ng_LeftEdge   = leftx;
  1879.     Gadget.ng_TopEdge    = topy;
  1880.     Gadget.ng_Width      = width;
  1881.     Gadget.ng_Height     = height;
  1882.     Gadget.ng_GadgetText = text;
  1883.     Gadget.ng_Flags      = flags;
  1884. }
  1885.  
  1886. AGLOBAL ABOOL readin(STRPTR pathname)
  1887. {   BPTR FileHandle;
  1888.  
  1889.     if (!(FileHandle = (BPTR) Open(pathname, MODE_OLDFILE)))
  1890.         return FALSE;
  1891.     if (Read(FileHandle, IOBuffer, 4096) == -1)
  1892.     /* the whole bug report must be < 4K */
  1893.     {   Close(FileHandle);
  1894.         return FALSE;
  1895.     }
  1896.     Close(FileHandle);
  1897.     return TRUE;
  1898. }
  1899.  
  1900. AGLOBAL void writeout(STRPTR pathname)
  1901. {   BPTR FileHandle;
  1902.  
  1903.     if (!(FileHandle = (BPTR) Open(pathname, MODE_NEWFILE)))
  1904.         rq("Can't open file for writing!");
  1905.     if (Write(FileHandle, IOBuffer, strlen(IOBuffer)) == -1)
  1906.     {   Close(FileHandle);
  1907.         rq("Can't write to file!");
  1908.     }
  1909.     Close(FileHandle);
  1910. }
  1911.  
  1912. AGLOBAL void launcheditor(STRPTR pathname)
  1913. {   GT_SetGadgetAttrs
  1914.     (   BU99_Right,
  1915.         MainWindowPtr, NULL,
  1916.         GA_Disabled, TRUE,
  1917.         TAG_DONE
  1918.     );
  1919.     if (!react)
  1920.     {   ClearMenuStrip(MainWindowPtr);
  1921.  
  1922.         strcpy(string, shared.editor);
  1923.     strcat(string, " ");
  1924.         strcat(string, pathname);
  1925.     if (!Execute(string, NULL, NULL))
  1926.             rq("Can't launch editor!");
  1927.     } else
  1928.     {   textedit();
  1929.     }
  1930.     GT_SetGadgetAttrs
  1931.     (   BU99_Right,
  1932.         MainWindowPtr, NULL,
  1933.         GA_Disabled, FALSE,
  1934.         TAG_DONE
  1935.     );
  1936. }
  1937.  
  1938. AGLOBAL void rq(STRPTR text)
  1939. {   EasyStruct.es_TextFormat = text;
  1940.     EasyRequest(MainWindowPtr, &EasyStruct, NULL);
  1941.  
  1942.     cleanexit(EXIT_FAILURE);
  1943. }
  1944.  
  1945. AGLOBAL void readordie(STRPTR pathname)
  1946. {   BPTR FileHandle;
  1947.  
  1948.     if (!(FileHandle = (BPTR) Open(pathname, MODE_OLDFILE)))
  1949.         rq("Can't open file for reading!");
  1950.     if (Read(FileHandle, IOBuffer, LONGESTFIELD) == -1)
  1951.     {   Close(FileHandle);
  1952.         rq("Can't read file!");
  1953.     }
  1954.     if (!Close(FileHandle))
  1955.         rq("Can't close file for reading!");
  1956. }
  1957.  
  1958. MODULE void parsewb(void)
  1959. {   struct DiskObject* DiskObject;
  1960.     STRPTR*            ToolArray;
  1961.     STRPTR             s;
  1962.  
  1963.     if ((*WBArg->wa_Name) && (DiskObject = GetDiskObject(WBArg->wa_Name)))
  1964.     {   ToolArray = (STRPTR *) DiskObject->do_ToolTypes;
  1965.  
  1966.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "PAL"))
  1967.             pal = TRUE;
  1968.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "GREY"))
  1969.             fillwindows = FALSE;
  1970.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "EDITOR"))
  1971.         {   react = FALSE;
  1972.         }
  1973.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "ICONTYPE"))
  1974.         {   if (MatchToolValue(s, "DISK"))
  1975.             {   icon.type = WBDISK - 1;
  1976.             } elif (MatchToolValue(s, "DRAWER"))
  1977.             {   icon.type = WBDRAWER - 1;
  1978.             } elif (MatchToolValue(s, "TOOL"))
  1979.             {   icon.type = WBTOOL - 1;
  1980.             } elif (MatchToolValue(s, "PROJECT"))
  1981.             {   icon.type = WBPROJECT - 1;
  1982.             } elif (MatchToolValue(s, "TRASHCAN"))
  1983.             {   icon.type = WBGARBAGE - 1;
  1984.             } elif (MatchToolValue(s, "DEVICE"))
  1985.             {   icon.type = WBDEVICE - 1;
  1986.             } elif (MatchToolValue(s, "KICKSTART"))
  1987.             {   icon.type = WBKICK - 1;
  1988.             } elif (MatchToolValue(s, "APPICON"))
  1989.             {   icon.type = WBAPPICON - 1;
  1990.         }   }
  1991.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "FUNCTION"))
  1992.         {   if (MatchToolValue(s, "1"))
  1993.                 page = 11;
  1994.             elif (MatchToolValue(s, "2"))
  1995.                 page = 21;
  1996.             elif (MatchToolValue(s, "3"))
  1997.                 page = 31;
  1998.             elif (MatchToolValue(s, "4"))
  1999.                 page = 41;
  2000.             elif (MatchToolValue(s, "5"))
  2001.                 page = 51;
  2002.             elif (MatchToolValue(s, "6"))
  2003.                 page = 61;
  2004.             elif (MatchToolValue(s, "7"))
  2005.                 page = 71;
  2006.             elif (MatchToolValue(s, "8"))
  2007.                 page = 81;
  2008.             elif (MatchToolValue(s, "9"))
  2009.                 page = 91;
  2010.             elif (MatchToolValue(s, "10"))
  2011.                 page = 101;
  2012.             elif (MatchToolValue(s, "11"))
  2013.             {   page = 111;
  2014.             } elif (MatchToolValue(s, "12"))
  2015.             {   page = 121;
  2016.         }   }
  2017.         FreeDiskObject(DiskObject);
  2018. }   }
  2019.  
  2020. AGLOBAL ULONG checkbreak(void)
  2021. {   struct IntuiMessage* MsgPtr;
  2022.     struct Gadget*       addr;
  2023.     ULONG                class;
  2024.     UWORD                code;
  2025.  
  2026.     while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  2027.     {   class  = MsgPtr->Class;
  2028.         code   = MsgPtr->Code;
  2029.         addr   = MsgPtr->IAddress;
  2030.         GT_ReplyIMsg((struct IntuiMessage *) MsgPtr);
  2031.         switch(class)
  2032.         {
  2033.         case IDCMP_CLOSEWINDOW:
  2034.             return(2);
  2035.         break;
  2036.         case IDCMP_GADGETUP:
  2037.             if (addr == BU99_Stop)
  2038.                 return(1);
  2039.         break;
  2040.         case IDCMP_VANILLAKEY:
  2041.             if (code == ESCAPE)
  2042.                 return(1);
  2043.         break;
  2044.         case IDCMP_REFRESHWINDOW:
  2045.             GT_BeginRefresh(MainWindowPtr);
  2046.             GT_EndRefresh(MainWindowPtr, TRUE);
  2047.         break;
  2048.         default:
  2049.         break;
  2050.     }   }
  2051.     return(0);
  2052. }
  2053.  
  2054. AGLOBAL void getdate(void)
  2055. {   struct DateTime DateTime;
  2056.  
  2057.     DateTime.dat_Format  = FORMAT_DOS;
  2058.     DateTime.dat_Flags   = NULL;
  2059.     DateTime.dat_StrDay  = weekdaystring;
  2060.     DateTime.dat_StrDate = datestring;
  2061.     DateTime.dat_StrTime = timestring;
  2062.  
  2063.     DateStamp(&(DateTime.dat_Stamp));
  2064.     if (!DateToStr(&DateTime))
  2065.         rq("Can't convert date!");
  2066. }
  2067.  
  2068. AGLOBAL void AddNameToTail(struct List* ListPtr, STRPTR name)
  2069. {   /* RKM Libraries, p. 496:
  2070.     
  2071.     "Allocate a NameNode structure, copy the given name into the
  2072.     structure, then add it [to] the...list." */
  2073.  
  2074.     struct NameNode* NameNodePtr;
  2075.  
  2076.     if (!(NameNodePtr = AllocMem(sizeof(struct NameNode), MEMF_CLEAR)))
  2077.         rq("Out of memory!");
  2078.     strcpy(NameNodePtr->nn_Data, name);
  2079.     NameNodePtr->nn_Node.ln_Name = NameNodePtr->nn_Data;
  2080.     NameNodePtr->nn_Node.ln_Type = NT_USER;
  2081.     NameNodePtr->nn_Node.ln_Pri  = 0;
  2082.     AddTail((struct List *) ListPtr, (struct Node *) NameNodePtr);
  2083. }
  2084.  
  2085. AGLOBAL void append(STRPTR pathname)
  2086. {   BPTR FileHandle;
  2087.  
  2088.     if (!(FileHandle = (BPTR) Open(pathname, MODE_READWRITE)))
  2089.         rq("Can't open file for appending!");
  2090.     Seek(FileHandle, 0, OFFSET_END);
  2091.     if (Write(FileHandle, IOBuffer, strlen(IOBuffer)) == -1)
  2092.     {   Close(FileHandle);
  2093.         rq("Can't append to file!");
  2094.     }
  2095.     if (!Close(FileHandle))
  2096.         rq("Can't close appended file!");
  2097. }
  2098.  
  2099. AGLOBAL ABOOL aboutloop(void)
  2100. {   struct IntuiMessage* MsgPtr;
  2101.     ABOOL                done = FALSE;
  2102.     UWORD                code, qual;
  2103.     ULONG                class;
  2104.  
  2105.     /* processes any outstanding messages for the About... window. */
  2106.     /* returns TRUE if user wants to exit, FALSE otherwise. */
  2107.  
  2108.     while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(AboutWindowPtr->UserPort))
  2109.     {   class = MsgPtr->Class;
  2110.         code  = MsgPtr->Code;
  2111.         qual  = MsgPtr->Qualifier;
  2112.         GT_ReplyIMsg(MsgPtr);
  2113.  
  2114.         if (class == CLOSEWINDOW)
  2115.             done = TRUE;
  2116.         elif (class == IDCMP_RAWKEY)
  2117.         {   if ((!(qual & IEQUALIFIER_REPEAT)) && code < KEYUP && (code < FIRSTQUALIFIER || code > LASTQUALIFIER))
  2118.                 done = TRUE;
  2119.     }   }
  2120.     return(done);
  2121. }
  2122.  
  2123. MODULE struct GelsInfo* setupDisplay(void)
  2124. {   struct GelsInfo* gInfo;
  2125.  
  2126.     /* set up the gels system.
  2127.     ** 0x03 says: when you allocate sprites for me, don't ever use
  2128.     ** sprites zero or one. This guarantees that sprite zero, the
  2129.     ** intuition pointer, stays intact. Remember sprite one shares
  2130.     ** colors with sprite zero. */
  2131.  
  2132.     if (NULL != (gInfo = setupGelSys(AboutWindowPtr->RPort, 0x03)))
  2133.        return(gInfo);
  2134.     else rq("Can't set up GEL system!");
  2135. }
  2136.  
  2137. AGLOBAL VOID DrawGels(void)
  2138. {   Animate(&animKey, AboutWindowPtr->RPort);
  2139.  
  2140.     SortGList(AboutWindowPtr->RPort);   /* Put the list in order. */
  2141.     DoCollision(AboutWindowPtr->RPort); /* Collision routines may called now */
  2142.     SortGList(AboutWindowPtr->RPort);   /* Put the list in order. */
  2143.  
  2144.     /* Draw 'em. */
  2145.     DrawGList(AboutWindowPtr->RPort, ViewPortAddress(AboutWindowPtr));
  2146.  
  2147.     WaitTOF();
  2148. }
  2149.  
  2150. /*--------------------------------------------------------------
  2151. ** setupBoing() - allocate and initialize an object that will
  2152. ** display as a boing ball with orbiting sattellites.
  2153. **
  2154. ** this is an animation object with four animation sequences
  2155. ** (boing and three satellites). Note that the satellites all share the
  2156. ** same single image data.
  2157. **
  2158. ** return NULL on failure.
  2159. */
  2160. MODULE struct AnimOb* setupBoing(void)
  2161. {   struct AnimOb*   bngOb;
  2162.     struct AnimComp* bngComp;
  2163.     struct AnimComp* satAComp;
  2164.     struct AnimComp* satBComp;
  2165.     struct AnimComp* satCComp;
  2166.  
  2167.     /* Firstly, we allocate and initialize an AnimOb structure, then we */
  2168.     /* call makeSeq() for the main ball and for each satellite. */
  2169.  
  2170.     if (NULL != (bngOb = AllocMem((LONG)sizeof(struct AnimOb), MEMF_CLEAR)))
  2171.     {   bngOb->NextOb           = NULL;
  2172.     bngOb->PrevOb        = NULL;
  2173.     bngOb->Clock        = 0;
  2174.         bngOb->AnY              = ( 97 << ANFRACSIZE);
  2175.         bngOb->AnX              = (  3 << ANFRACSIZE);
  2176.     bngOb->AnOldY        = bngOb->AnY;
  2177.     bngOb->AnOldX        = bngOb->AnX;
  2178.         bngOb->YVel             = 0;
  2179.         bngOb->XVel             = 1 << ANFRACSIZE;
  2180.     bngOb->YAccel        = 0;
  2181.     bngOb->XAccel        = 0;
  2182.     bngOb->RingYTrans    = BNG3RINGY << ANFRACSIZE;
  2183.     bngOb->RingXTrans    = BNG3RINGX << ANFRACSIZE;
  2184.     bngOb->AnimORoutine    = bounceORoutine;
  2185.     bngOb->AUserExt        = 0;
  2186.  
  2187.         newBoingBob.nb_DBuf     = 0;
  2188.         newBoingSeq.nas_HeadOb  = bngOb;
  2189.  
  2190.         satACRoutines[4]        = goInFrontOfHead;
  2191.         satACRoutines[12]       = goBehindHead;
  2192.         satBCRoutines[8]        = goInFrontOfHead;
  2193.         satBCRoutines[0]        = goBehindHead;
  2194.         satCCRoutines[4]        = goInFrontOfHead;
  2195.         satCCRoutines[12]       = goBehindHead;
  2196.  
  2197.         newSatABob.nb_DBuf      = 0;
  2198.         newSatBBob.nb_DBuf      = 0;
  2199.         newSatCBob.nb_DBuf      = 0;
  2200.         newSatASeq.nas_HeadOb   = bngOb;
  2201.         newSatBSeq.nas_HeadOb   = bngOb;
  2202.         newSatCSeq.nas_HeadOb   = bngOb;
  2203.  
  2204.     if (NULL != (bngComp = makeSeq(&newBoingBob, &newBoingSeq)))
  2205.         {   bngComp->Flags |= RINGTRIGGER;
  2206.             bngOb->HeadComp = bngComp;
  2207.  
  2208.             if (NULL != (satAComp = makeSeq(&newSatABob, &newSatASeq)))
  2209.             {   bngComp->AnimBob->Before = satAComp->AnimBob;
  2210.                 satAComp->AnimBob->After = bngComp->AnimBob;
  2211.  
  2212.                 if (NULL != (satBComp = makeSeq(&newSatBBob, &newSatBSeq)))
  2213.                 {   satAComp->AnimBob->Before = satBComp->AnimBob;
  2214.                     satBComp->AnimBob->After = satAComp->AnimBob;
  2215.  
  2216.                     if (NULL != (satCComp = makeSeq(&newSatCBob, &newSatCSeq)))
  2217.                     {   satBComp->AnimBob->Before = satCComp->AnimBob;
  2218.                         satCComp->AnimBob->After = satBComp->AnimBob;
  2219.  
  2220.                         bngComp->NextComp  = satAComp;
  2221.                         bngComp->PrevComp  = NULL;
  2222.  
  2223.                         satAComp->NextComp = satBComp;
  2224.                         satAComp->PrevComp = bngComp;
  2225.  
  2226.                         satBComp->NextComp = satCComp;
  2227.                         satBComp->PrevComp = satAComp;
  2228.  
  2229.                         satCComp->NextComp = NULL;
  2230.                         satCComp->PrevComp = satBComp;
  2231.  
  2232.                         return(bngOb);
  2233.                     }
  2234.                     freeSeq(satBComp,RBMDEPTH);
  2235.                 }
  2236.                 freeSeq(satAComp,RBMDEPTH);
  2237.             }
  2238.             freeSeq(bngComp,RBMDEPTH);
  2239.         }
  2240.     FreeMem(bngOb, (LONG)sizeof(struct AnimOb));
  2241.     }
  2242.     return(NULL);
  2243. }
  2244.  
  2245. /*------------------------------------------------------
  2246. ** This ORoutine makes the Object Bounce off Borders. */
  2247.  
  2248. WORD bounceORoutine(struct AnimOb* anOb)
  2249. {   SHORT X = anOb->AnX >> ANFRACSIZE;
  2250.  
  2251.     if (((X                                                     < 3              ) && (anOb->XVel < 0)) ||
  2252.         ((X + (anOb->HeadComp->AnimBob->BobVSprite->Width << 4) > ABOUTXPIXEL - 3) && (anOb->XVel > 0)))
  2253.        {   anOb->XVel = -(anOb->XVel);
  2254.        }
  2255.  
  2256.     return(0);
  2257. }
  2258.  
  2259. /*--------------------------------------------------------------
  2260. ** This CRoutine rearranges Bob Before and After pointers in a
  2261. ** way that makes the Component passed look like it is in front
  2262. ** of its' head component.
  2263. ** 
  2264. ** Used for Boing satelittes.
  2265. ** 
  2266. ** So that they go in front of AND behind the boing ball.
  2267. */
  2268. MODULE WORD goInFrontOfHead(struct AnimComp *aComp)
  2269. {
  2270. /* close up hole */
  2271. if (aComp->AnimBob->Before != NULL)
  2272.     aComp->AnimBob->Before->After = aComp->AnimBob->After;
  2273. if (aComp->AnimBob->After != NULL)
  2274.     aComp->AnimBob->After->Before = aComp->AnimBob->Before;
  2275.  
  2276. /* reinsert */
  2277. aComp->AnimBob->Before = aComp->HeadOb->HeadComp->AnimBob->Before;
  2278. aComp->AnimBob->After = aComp->HeadOb->HeadComp->AnimBob;
  2279. if (aComp->AnimBob->Before != NULL)
  2280.     aComp->AnimBob->Before->After = aComp->AnimBob;
  2281. aComp->HeadOb->HeadComp->AnimBob->Before = aComp->AnimBob;
  2282.  
  2283. return(0);
  2284. }
  2285.  
  2286. /*--------------------------------------------------------------
  2287. ** This CRoutine rearranges Bob Before and After pointers in a
  2288. ** way that makes the Component passed look like it is behind
  2289. ** its' head component.
  2290. */
  2291. MODULE WORD goBehindHead(struct AnimComp *aComp)
  2292. {
  2293. if (aComp->AnimBob->Before != NULL)
  2294.     aComp->AnimBob->Before->After = aComp->AnimBob->After;
  2295. if (aComp->AnimBob->After != NULL)
  2296.     aComp->AnimBob->After->Before = aComp->AnimBob->Before;
  2297.  
  2298. aComp->AnimBob->After = aComp->HeadOb->HeadComp->AnimBob->After;
  2299. aComp->AnimBob->Before = aComp->HeadOb->HeadComp->AnimBob;
  2300. if (aComp->AnimBob->After != NULL)
  2301.     aComp->AnimBob->After->Before = aComp->AnimBob;
  2302. aComp->HeadOb->HeadComp->AnimBob->After = aComp->AnimBob;
  2303.  
  2304. return(0);
  2305. }
  2306.  
  2307. AGLOBAL void boingball(void)
  2308. {   if (NULL != (gInfo = setupDisplay()))
  2309.     {   InitAnimate(&animKey);
  2310.  
  2311.         if (NULL != (boingOb = setupBoing()))
  2312.             AddAnimOb(boingOb, &animKey, AboutWindowPtr->RPort);
  2313. }   }
  2314. AGLOBAL void unboingball(void)
  2315. {   freeOb(boingOb, RBMDEPTH);
  2316.     cleanupGelSys(gInfo, AboutWindowPtr->RPort);
  2317. }
  2318.  
  2319. AGLOBAL void double_init(void)
  2320. {   if (!(EADataPtr = AllocVec(2048, MEMF_CLEAR | MEMF_PUBLIC)))
  2321.     {   rq("Out of memory!");
  2322. }   }
  2323.  
  2324. AGLOBAL void fliplog(ABOOL keyboard)
  2325. {   if (keyboard)
  2326.     {   if (CB99_Log->Flags & GFLG_SELECTED)
  2327.         {   shared.log = FALSE;
  2328.         } else
  2329.         {   shared.log = TRUE;
  2330.     }   }
  2331.     else
  2332.     {   if (CB99_Log->Flags & GFLG_SELECTED)
  2333.         {   shared.log = TRUE;
  2334.         } else
  2335.         {   shared.log = FALSE;
  2336.     }   }
  2337.  
  2338.     if (!shared.log)
  2339.     {   GT_SetGadgetAttrs
  2340.         (   ST99_Output,
  2341.             MainWindowPtr, NULL,
  2342.             GA_Disabled, TRUE,
  2343.             TAG_DONE
  2344.         );
  2345.         GT_SetGadgetAttrs
  2346.         (   BU99_OutputASL,
  2347.             MainWindowPtr, NULL,
  2348.             GA_Disabled, TRUE,
  2349.             TAG_DONE
  2350.         );
  2351.     } else
  2352.     {   GT_SetGadgetAttrs
  2353.         (   ST99_Output,
  2354.             MainWindowPtr, NULL,
  2355.             GA_Disabled, FALSE,
  2356.             TAG_DONE
  2357.         );
  2358.         GT_SetGadgetAttrs
  2359.         (   BU99_OutputASL,
  2360.             MainWindowPtr, NULL,
  2361.             GA_Disabled, FALSE,
  2362.             TAG_DONE
  2363.         );
  2364.     }
  2365.     GT_SetGadgetAttrs
  2366.     (   CB99_Log,
  2367.         MainWindowPtr, NULL,
  2368.         GTCB_Checked, shared.log,
  2369.         TAG_DONE
  2370.     );
  2371. }
  2372.  
  2373. AGLOBAL void outputasl(void)
  2374. {   asl();
  2375.     GT_SetGadgetAttrs
  2376.     (   ST99_Output,
  2377.         MainWindowPtr,
  2378.         NULL,
  2379.         GTST_String, aslresult,
  2380.         TAG_DONE
  2381.     );
  2382. }
  2383. AGLOBAL void outputstring(void)
  2384. {   strcpy
  2385.     (   shared.output,
  2386.         ((struct StringInfo *) ST99_Output->SpecialInfo)->Buffer
  2387.     );
  2388. }
  2389. AGLOBAL void drawgadgets(WORD gadgets)
  2390. {   if (!PrevGadPtr)
  2391.         rq("Can't create GadTools gadgets!");
  2392.     AddGList(MainWindowPtr, BU99_Right, (UWORD) ~0, gadgets, NULL);
  2393.     RefreshGList(BU99_Right, MainWindowPtr, NULL, -1);
  2394.     GT_RefreshWindow(MainWindowPtr, NULL);
  2395. }
  2396.  
  2397. AGLOBAL void parse(STRPTR terminator)
  2398. {   ABOOL done = FALSE;
  2399.     ULONG suboffset;
  2400.  
  2401.     suboffset = offset;
  2402.     while (!done)
  2403.     {   string[offset - suboffset] = IOBuffer[offset];
  2404.         if (!(strncmp(&(IOBuffer[offset]), terminator, strlen(terminator))))
  2405.         {   string[offset - suboffset] = 0;
  2406.             offset += strlen(terminator);
  2407.             done = TRUE;
  2408.         } elif (offset > strlen(IOBuffer))
  2409.         {   /* failure */
  2410.             string[0] = 0;
  2411.             done = TRUE;
  2412.         } else offset++;
  2413. }   }
  2414.  
  2415. AGLOBAL void parsetoend(void)
  2416. {   ABOOL done      = FALSE;
  2417.     ULONG suboffset = 0;
  2418.  
  2419.     while (!done)
  2420.     {   string[suboffset] = IOBuffer[offset];
  2421.         if (offset > strlen(IOBuffer))
  2422.         {   /* EOF */
  2423.             string[suboffset] = 0;
  2424.             done = TRUE;
  2425.         } else
  2426.         {   offset++;
  2427.             suboffset++;
  2428. }   }   }
  2429.  
  2430. AGLOBAL ABOOL saveasl(STRPTR message)
  2431. {   struct FileRequester* ASLRqPtr;
  2432.     TEXT                  tempstring[VLONGFIELD + 1];
  2433.     ABOOL                 success;
  2434.  
  2435.     strcpy(tempstring, "Report+: ");
  2436.     strcat(tempstring, message);
  2437.  
  2438.     if (!(ASLRqPtr = AllocAslRequestTags(ASL_FileRequest, ASL_Pattern, "~(#?.info)", ASL_Window, MainWindowPtr, TAG_DONE)))
  2439.         rq("Can't create ASL request!");
  2440.     if
  2441.     (   AslRequestTags(ASLRqPtr, ASL_Dir, asldir, ASL_Hail, tempstring, ASL_FuncFlags, FILF_PATGAD | FILF_SAVE, TAG_DONE)
  2442.      && *(ASLRqPtr->rf_File) != 0
  2443.     )
  2444.     {   strcpy(asldir, ASLRqPtr->rf_Dir);
  2445.         strcpy(aslresult, ASLRqPtr->rf_Dir);
  2446.         if (!AddPart(aslresult, ASLRqPtr->rf_File, VLONGFIELD))
  2447.             rq("Can't add filename to pathname!");
  2448.         success = TRUE;
  2449.     } else
  2450.     {   strcpy(asldir, "");
  2451.         strcpy(aslresult, "");
  2452.         success = FALSE;
  2453.     }
  2454.     if (ASLRqPtr) /* will always be true */
  2455.         FreeAslRequest(ASLRqPtr);
  2456.     return(success);
  2457. }
  2458.  
  2459. AGLOBAL void handlemenus(UWORD code)
  2460. {   /* struct MenuItem* ItemPtr; */
  2461.        BPTR             LockPtr;
  2462.  
  2463.     if (code != MENUNULL) /* while (code != MENUNULL) */
  2464.     {   /* ItemPtr = ItemAddress(MenuPtr, code); */
  2465.         switch (MENUNUM(code))
  2466.         {
  2467.         case MN_PROJECT:
  2468.             switch (ITEMNUM(code))
  2469.             {
  2470.             case IN_NEW:
  2471.                 if (page == 11)
  2472.                     newreport(TRUE);
  2473.                 elif (page == 21)
  2474.                     newaminet(TRUE);
  2475.                 elif (page == 41)
  2476.                     newautodoc(TRUE);
  2477.                 elif (page == 111)
  2478.                     newagdb(TRUE);
  2479.             break;
  2480.             case IN_OPEN:
  2481.                 if (page == 11)
  2482.                     openreport();
  2483.                 elif (page == 21)
  2484.                     openaminet();
  2485.                 elif (page == 41)
  2486.                     openautodoc();
  2487.                 elif (page == 91)
  2488.                 {   batt_open();
  2489.                 } elif (page == 111)
  2490.                     openagdb();
  2491.             break;
  2492.             case IN_SAVE:
  2493.                 if (page == 11)
  2494.                     savereport(FALSE);
  2495.                 elif (page == 21)
  2496.                     saveaminet(FALSE);
  2497.                 elif (page == 41)
  2498.                     saveautodoc(FALSE);
  2499.                 elif (page == 91)
  2500.                 {   batt_save(FALSE);
  2501.                 } elif (page == 111)
  2502.                     saveagdb(FALSE);
  2503.             break;
  2504.             case IN_SAVEAS:
  2505.                 if (page == 11)
  2506.                     savereport(TRUE);
  2507.                 elif (page == 21)
  2508.                     saveaminet(TRUE);
  2509.                 elif (page == 41)
  2510.                     saveautodoc(TRUE);
  2511.                 elif (page == 91)
  2512.                 {   batt_save(TRUE);
  2513.                 } elif (page == 111)
  2514.                     saveagdb(TRUE);
  2515.             break;
  2516.             case IN_QUIT:
  2517.                 cleanexit(EXIT_SUCCESS);
  2518.             break;
  2519.             default:
  2520.             break;
  2521.             }
  2522.         break;
  2523.         case MN_HELP:
  2524.             switch (ITEMNUM(code))
  2525.             {
  2526.             case IN_ABOUT:
  2527.                 helpabout();
  2528.             break;
  2529.             case IN_MANUAL:
  2530.                 LockPtr = Lock("CON:", ACCESS_READ);
  2531.                 if (SystemTags
  2532.                 (   "SYS:Utilities/MultiView ReportPlus.guide",
  2533.                     SYS_Input,  (ULONG) LockPtr,
  2534.                     SYS_Output, NULL,
  2535.                     SYS_Asynch, TRUE,
  2536.                     TAG_DONE
  2537.                 ) == -1)
  2538.                     DisplayBeep(ScreenPtr);
  2539.                 elif (pal)
  2540.                     ScreenToFront(ScreenPtr);
  2541.                 UnLock(LockPtr);
  2542.             break;
  2543.             default:
  2544.             break;
  2545.             }
  2546.         break;
  2547.         default:
  2548.         break;
  2549.         }
  2550.         /* Doing things the above way disables multi-selection,
  2551.         but prevents `endless selection'.
  2552.         code = ItemPtr->NextSelect; */
  2553. }   }
  2554.  
  2555. AGLOBAL void lockscreen(void)
  2556. {   if (!pal)
  2557.     {   if (!(ScreenPtr = LockPubScreen(NULL)))
  2558.             rq("Can't lock default public screen!");
  2559. }   }
  2560. AGLOBAL void unlockscreen(void)
  2561. {   if (!pal && ScreenPtr)
  2562.     {   UnlockPubScreen(NULL, ScreenPtr);
  2563.         ScreenPtr = NULL;
  2564. }   }
  2565.  
  2566. AGLOBAL void getfillcolour(void)
  2567. {   if (fillwindows)
  2568.     {   lockscreen();
  2569.         fillcolour = FindColor
  2570.         (   ScreenPtr->ViewPort.ColorMap,
  2571.             0x99999999, /* red */
  2572.             0x99999999, /* green */
  2573.             0xFFFFFFFF, /* blue */
  2574.            -1
  2575.         );
  2576.         unlockscreen();
  2577.     } else fillcolour = 0;
  2578. }
  2579.  
  2580. MODULE void eachwildcard(STRPTR subpattern)
  2581. {   struct AnchorPath* AnchorPathPtr;
  2582.     BPTR               OldDir;
  2583.     TEXT               dirbuffer[VLONGFIELD + 1];
  2584.     BOOL               result;
  2585.     ABOOL              done;
  2586.  
  2587.     dirbuffer[0] = NULL;
  2588.     if (!(AnchorPathPtr = AllocMem(sizeof(struct AnchorPath), MEMF_ANY | MEMF_PUBLIC)))
  2589.         return;
  2590.  
  2591.     AnchorPathPtr->ap_BreakBits = NULL;
  2592.     AnchorPathPtr->ap_Flags = NULL;
  2593.     AnchorPathPtr->ap_Strlen = 0;
  2594.     result = MatchFirst(subpattern, AnchorPathPtr);
  2595.     if (result == 0)
  2596.     {   OldDir = CurrentDir(AnchorPathPtr->ap_Current->an_Lock);
  2597.         if (!NameFromLock(AnchorPathPtr->ap_Current->an_Lock, dirbuffer, VLONGFIELD))
  2598.         {   MatchEnd(AnchorPathPtr);
  2599.             return;
  2600.         }
  2601.         if (!AddPart(dirbuffer, AnchorPathPtr->ap_Info.fib_FileName, VLONGFIELD))
  2602.         {   MatchEnd(AnchorPathPtr);
  2603.             return;
  2604.         }
  2605.         CurrentDir(OldDir);
  2606.         strcat(shared.finallist, "\"");
  2607.         strcat(shared.finallist, dirbuffer);
  2608.         strcat(shared.finallist, "\" ");
  2609.     } elif (result != ERROR_NO_MORE_ENTRIES)
  2610.     {   MatchEnd(AnchorPathPtr);
  2611.         return;
  2612.     }
  2613.  
  2614.     done = FALSE;
  2615.     while (!done)
  2616.     {   result = MatchNext(AnchorPathPtr);
  2617.         if (result == 0)
  2618.         {   OldDir = CurrentDir(AnchorPathPtr->ap_Current->an_Lock);
  2619.             if (!NameFromLock(AnchorPathPtr->ap_Current->an_Lock, dirbuffer, VLONGFIELD))
  2620.             {   MatchEnd(AnchorPathPtr);
  2621.                 return;
  2622.             }
  2623.             if (!AddPart(dirbuffer, AnchorPathPtr->ap_Info.fib_FileName, VLONGFIELD))
  2624.             {   MatchEnd(AnchorPathPtr);
  2625.                 return;
  2626.             }
  2627.             CurrentDir(OldDir);
  2628.             strcat(shared.finallist, "\"");
  2629.             strcat(shared.finallist, dirbuffer);
  2630.             strcat(shared.finallist, "\" ");
  2631.         } elif (result != ERROR_NO_MORE_ENTRIES)
  2632.         {   MatchEnd(AnchorPathPtr);
  2633.             return;
  2634.         } else done = TRUE;
  2635.     }
  2636.     MatchEnd(AnchorPathPtr);
  2637.     FreeMem(AnchorPathPtr, sizeof(struct AnchorPath));
  2638. }
  2639.  
  2640. AGLOBAL void multiasl(STRPTR pattern)
  2641. {   struct FileRequester* ASLRqPtr;
  2642.     ULONG                 i;
  2643.     TEXT                  quotestring[2];
  2644.  
  2645.     quotestring[0] = QUOTE;
  2646.     quotestring[1] = 0;
  2647.  
  2648.     /* It would also be good to correctly
  2649.     handle selection of directories. */
  2650.  
  2651.     if (!(ASLRqPtr = AllocAslRequestTags(ASL_FileRequest, ASL_Pattern, pattern, ASL_Window, MainWindowPtr, TAG_DONE)))
  2652.         rq("Can't create ASL request!");
  2653.     if (AslRequestTags(ASLRqPtr, ASL_Dir, asldir, ASL_Hail, "Report+ file multiselector", ASL_FuncFlags, FILF_PATGAD | FILF_MULTISELECT, TAG_DONE) && *(ASLRqPtr->rf_File) != 0)
  2654.     {   if (ASLRqPtr->rf_NumArgs)
  2655.         {   /* rf_ArgList is an array of WBArg structures. Each entry in
  2656.             this array corresponds to one of the files the user selected
  2657.             (in alphabetical order). The user multiselected; step through
  2658.             the list of selected files. */
  2659.  
  2660.             strcpy(asldir, ASLRqPtr->rf_Dir);
  2661.             strcpy(shared.pathname, quotestring);
  2662.             strcat(shared.pathname, ASLRqPtr->rf_Dir);
  2663.             if (!AddPart(shared.pathname, (ASLRqPtr->rf_ArgList)[0].wa_Name, VLONGFIELD))
  2664.                 rq("Can't add filename to pathname!");
  2665.             strcat(shared.pathname, quotestring);
  2666.             strcat(shared.pathname, " ");
  2667.             for (i = 1; i < ASLRqPtr->rf_NumArgs; i++)
  2668.             {   strcat(shared.pathname, quotestring);
  2669.                 strcat(shared.pathname, ASLRqPtr->rf_Dir);
  2670.                 if (!AddPart(shared.pathname, (ASLRqPtr->rf_ArgList)[i].wa_Name, VLONGFIELD))
  2671.                    rq("Can't add filename to pathname!");
  2672.                 strcat(shared.pathname, quotestring);
  2673.                 if (i < ASLRqPtr->rf_NumArgs - 1)
  2674.                     strcat(shared.pathname, " ");
  2675.         }   }
  2676.         else
  2677.         {   /* The user didn't multiselect; use the normal way to get the
  2678.             filename. */
  2679.  
  2680.             strcpy(shared.pathname, quotestring);
  2681.             strcat(shared.pathname, ASLRqPtr->rf_Dir);
  2682.             if (!AddPart(shared.pathname, ASLRqPtr->rf_File, VLONGFIELD))
  2683.                 rq("Can't add filename to pathname!");
  2684.             strcat(shared.pathname, quotestring);
  2685.     }   }
  2686.     if (ASLRqPtr)
  2687.         FreeAslRequest(ASLRqPtr);
  2688. }
  2689.  
  2690. AGLOBAL void checkabort(ABOOL gui)
  2691. {   struct Gadget*       addr;
  2692.     struct IntuiMessage* MsgPtr;
  2693.     ULONG                class, signals, gid, result;
  2694.     UWORD                code;
  2695.  
  2696.     /* OK, we've just finished operating on that file. Now before we */
  2697.     /* start on the next one, check whether the user still wants to... */
  2698.     signals = SetSignal(0L, 0L);
  2699.     if (signals & SIGBREAKF_CTRL_C)
  2700.     {   stop = TRUE;
  2701.         SetSignal(0L, SIGBREAKF_CTRL_C); /* clear the Ctrl-C signal */
  2702.         if (gui)
  2703.         {   if (page == 71)
  2704.             {   GT_SetGadgetAttrs
  2705.                 (   TE71_Status,
  2706.                     MainWindowPtr, NULL,
  2707.                     GTTX_Text, "Aborted by user!",
  2708.                     TAG_DONE
  2709.                 );
  2710.             } else
  2711.             {   /* assert(page == 121); */
  2712.                 SetGadgetAttrs
  2713.                 (   gadgets[GID_12_ST2], MainWindowPtr, NULL,
  2714.                     STRINGA_TextVal, "Aborted by user!",
  2715.                     TAG_DONE
  2716.                 );
  2717.         }   }
  2718.         else
  2719.         {   Printf("Aborted by user!\n");
  2720.             Flush(Output());
  2721.     }   }
  2722.  
  2723.     if (page == 71)
  2724.     {
  2725.     while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  2726.     {   class  = MsgPtr->Class;                       
  2727.         addr   = MsgPtr->IAddress;
  2728.         GT_ReplyIMsg(MsgPtr);
  2729.         switch(class)
  2730.         {
  2731.         case IDCMP_CLOSEWINDOW:
  2732.             cleanexit(EXIT_SUCCESS);
  2733.         break;
  2734.         case IDCMP_GADGETUP:
  2735.             /* assert(gui); */
  2736.             if (addr == BU99_Stop)
  2737.             {   GT_SetGadgetAttrs
  2738.                 (   TE71_Status,
  2739.                     MainWindowPtr, NULL,
  2740.                     GTTX_Text, "Aborted by user!",
  2741.                     TAG_DONE
  2742.                 );
  2743.                 stop = TRUE;
  2744.             }
  2745.         break;
  2746.         default:
  2747.         break;
  2748.     }   }
  2749.     } else
  2750.     {   /* assert(page == 121); */
  2751.         while ((result = DoMethod((Object *) object, WM_HANDLEINPUT, &code)) != WMHI_LASTMSG)
  2752.         {   switch (result & WMHI_CLASSMASK)
  2753.             {
  2754.             case WMHI_MENUPICK:
  2755.                 ; /* handlemenus(code); */
  2756.             break;
  2757.             case WMHI_CLOSEWINDOW:
  2758.                 done = quit = TRUE;
  2759.             break;
  2760.             case WMHI_GADGETUP:
  2761.                 gid = result & WMHI_GADGETMASK;
  2762.                 if (gid == GID_12_BU4)
  2763.                 {   stop = TRUE;
  2764.                 }
  2765.             break;
  2766.             default:
  2767.             break;
  2768. }   }   }   }
  2769.  
  2770. AGLOBAL void convert(ABOOL gui)
  2771. {   ULONG i, j, length;
  2772.     ABOOL flag,   /* are we in letters (TRUE) or whitespace (FALSE)? */
  2773.           quoted; /* are we quoted (TRUE) or unquoted (FALSE)? */
  2774.  
  2775.     /* At this point we have a list of pathnames, separated by spaces and
  2776.     NULL-terminated. If they came from ASL, they will be quoted, otherwise,
  2777.     they may not.
  2778.  
  2779.     shared.pathname: the actual contents of the string gadget.
  2780.     shared.thatfile: each file that we pass to eachwildcard().
  2781.     shared.finallist: the final list produced, containing all pathnames.
  2782.     shared.thisfile: each file that we pass for conversion. */
  2783.  
  2784.     stop = flag = quoted = FALSE;
  2785.     length = strlen(shared.pathname);
  2786.     j = shared.finallist[0] = 0;
  2787.     for (i = 0; i < length; i++)
  2788.     {   if (shared.pathname[i] == ' ' && flag && !quoted)
  2789.         {   /* if we're unquoted and have a space */
  2790.             shared.thatfile[j] = 0; /* then NULL-terminate the pathname */
  2791.             eachwildcard(shared.thatfile);
  2792.             j = 0;
  2793.             flag = FALSE;
  2794.         } elif (shared.pathname[i] == QUOTE)
  2795.         {   if (!flag && !quoted)
  2796.             {   flag = TRUE; /* we're in letters */
  2797.                 quoted = TRUE; /* it's a quote */
  2798.             } elif (flag && quoted)
  2799.             {   quoted = FALSE; /* it's an unquote */
  2800.         }   }
  2801.         else
  2802.         {   shared.thatfile[j++] = shared.pathname[i];
  2803.             flag = TRUE; /* we're in letters */
  2804.     }   }
  2805.     /* Now we are at the end. */
  2806.     if (flag) /* if we're in letters */
  2807.     {   shared.thatfile[j] = 0;
  2808.         /* then it is ended, quoted or not. Although we could */
  2809.         /* report an error condition if there are an odd */
  2810.         /* number of quotes (ie. a missing quote). */
  2811.         eachwildcard(shared.thatfile);
  2812.     }
  2813.  
  2814.     flag = quoted = FALSE;
  2815.     length = strlen(shared.finallist);
  2816.     j = 0;
  2817.     for (i = 0; i < length; i++)
  2818.     {   if (shared.finallist[i] == ' ' && flag && !quoted)
  2819.         {   /* if we're unquoted and have a space */
  2820.             shared.thisfile[j] = 0; /* then NULL-terminate the pathname */
  2821.             if (!stop)
  2822.             {   if (shared.function == 7 - 1)
  2823.                 {   eolconvert(gui);
  2824.                 } else
  2825.                 {   /* assert(shared.function == 12 - 1); */
  2826.                     iconconvert(gui);
  2827.             }   }
  2828.             j = 0;
  2829.             flag = FALSE;
  2830.         } elif (shared.finallist[i] == QUOTE)
  2831.         {   if (!flag && !quoted)
  2832.             {   flag = TRUE; /* we're in letters */
  2833.                 quoted = TRUE; /* it's a quote */
  2834.             } elif (flag && quoted)
  2835.             {   quoted = FALSE; /* it's an unquote */
  2836.         }   }
  2837.         else
  2838.         {   shared.thisfile[j++] = shared.finallist[i];
  2839.             flag = TRUE; /* we're in letters */
  2840.         }
  2841.         if (stop)
  2842.         {   return;
  2843.     }   }
  2844.     /* Now we are at the end. */
  2845.     if (flag) /* if we're in letters */
  2846.     {   shared.thisfile[j] = 0;
  2847.         /* then it is ended, quoted or not. Although we could */
  2848.         /* report an error condition if there are an odd */
  2849.         /* number of quotes (ie. a missing quote). */
  2850.         if (shared.function == 7 - 1)
  2851.         {   eolconvert(gui);
  2852.         } else
  2853.         {   /* assert(shared.function == 12 - 1); */
  2854.             iconconvert(gui);
  2855. }   }   }
  2856.